精华内容
下载资源
问答
  • 爬虫Spider 04 - requests.get()参数---查询参数-params | Web客户端验证参数-auth | SSL证书认证参数-...
    2019-10-14 08:43:09

    Spider 03回顾

    目前反爬总结

    • 基于User-Agent反爬
    1、发送请求携带请求头: headers={'User-Agent' : 'Mozilla/5.0 xxxxxx'}
    2、多个请求随机切换User-Agent
       1、定义列表存放大量User-Agent,使用random.choice()每次随机选择
       2、定义py文件存放大量User-Agent,使用random.choice()每次随机选择
       3、使用fake_useragent模块每次访问随机生成User-Agent
        # sudo pip3 install fake_useraget
        
        * from fake_useragent import UserAgent
        * ua = UserAgent()
        * user_agent = ua.random
        * print(user_agent)
    
    • 响应内容前端JS做处理反爬
    1、html页面中可匹配出内容,程序中匹配结果为空
       * 响应内容中嵌入js,对页面结构做了一定调整导致,通过查看网页源代码,格式化输出查看结构,更改xpath或者正则测试
    2、如果数据出不来可考虑更换 IE 的User-Agent尝试,数据返回最标准
    

    请求模块总结

    • urllib库使用流程
    # 编码
    params = {
        '':'',
        '':''
    }
    params = urllib.parse.urlencode(params)
    url = baseurl + params
    
    # 请求
    request = urllib.request.Request(url,headers=headers)
    response = urllib.request.urlopen(request)
    html = response.read().decode('utf-8')
    
    • requests模块使用流程
    baseurl = 'http://tieba.baidu.com/f?'
    html = requests.get(url,headers=headers).content.decode('utf-8','ignore')
    
    • 响应对象res属性
    res.text :字符串
    res.content :bytes
    res.encoding:字符编码 res.encoding='utf-8'
    res.status_code :HTTP响应码
    res.url :实际数据URL地址
    

    解析模块总结

    • 正则解析re模块
    import re 
    
    pattern = re.compile(r'正则表达式',re.S)
    r_list = pattern.findall(html)
    
    • lxml解析库
    from lxml import etree
    
    parse_html = etree.HTML(res.text)
    r_list = parse_html.xpath('xpath表达式')
    

    xpath表达式

    • 匹配规则
    1、节点对象列表
       # xpath示例: //div、//div[@class="student"]、//div/a[@title="stu"]/span
    2、字符串列表
       # xpath表达式中末尾为: @src、@href、text()
    
    • xpath高级
    1、基准xpath表达式: 得到节点对象列表
    2for r in [节点对象列表]:
           username = r.xpath('./xxxxxx')  
    
    # 此处注意遍历后继续xpath一定要以:  . 开头,代表当前节点
    

    写程序注意

    # 最终目标: 不要使你的程序因为任何异常而终止
    1、页面请求设置超时时间,并用try捕捉异常,超过指定次数则更换下一个URL地址
    2、所抓取任何数据,获取具体数据前先判断是否存在该数据,可使用列表推导式
    # 多级页面数据抓取注意
    1、主线函数: 解析一级页面函数(将所有数据从一级页面中解析并抓取)
    

    增量爬虫如何实现

    1、数据库中创建指纹表,用来存储每个请求的指纹
    2、在抓取之前,先到指纹表中确认是否之前抓取过
    

    Chrome浏览器安装插件

    • 安装方法
    # 在线安装
    1、下载插件 - google访问助手
    2、安装插件 - google访问助手: Chrome浏览器-设置-更多工具-扩展程序-开发者模式-拖拽(解压后的插件)
    3、在线安装其他插件 - 打开google访问助手 - google应用商店 - 搜索插件 - 添加即可
    
    # 离线安装
    1、下载插件 - xxx.crx 重命名为 xxx.zip
    2、输入地址: chrome://extensions/   打开- 开发者模式
    3、拖拽 插件(或者解压后文件夹) 到浏览器中
    4、重启浏览器,使插件生效
    

    Spider 04笔记

    链家二手房案例(xpath)

    实现步骤

    • 确定是否为静态
    打开二手房页面 -> 查看网页源码 -> 搜索关键字
    
    • xpath表达式
    1、基准xpath表达式(匹配每个房源信息节点列表)
       此处滚动鼠标滑轮时,li节点的class属性值会发生变化,通过查看网页源码确定xpath表达式
      //ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]
    
    2、依次遍历后每个房源信息xpath表达式
       * 名称: './/a[@data-el="region"]/text()'
       
       # 户型+面积+方位+是否精装
       info_list = './/div[@class="houseInfo"]/text()'  [0].strip().split('|')
       * 户型: info_list[1]
       * 面积: info_list[2]
       * 方位: info_list[3]
       * 精装: info_list[4]
       
    
       * 楼层: './/div[@class="positionInfo"]/text()'
       * 区域: './/div[@class="positionInfo"]/a/text()'
       * 总价: './/div[@class="totalPrice"]/span/text()'
       * 单价: './/div[@class="unitPrice"]/span/text()'
    

    代码实现

    import time
    import requests
    from lxml import etree
    import random
    from fake_useragent import UserAgent
    
    class LianJiaSpider:
        def __init__(self):
            self.url='https://zz.lianjia.com/ershoufang/pg{}'
            self.blag=1
    
        # 随机headers
        def get_headers(self):
            agent=UserAgent().random
            headers={'User-Agent':agent}
            return headers
    
        # 请求
        def get_html(self, url):
            if self.blag<=3:
                try:
                    res=requests.get(url=url,headers=self.get_headers(),timeout=5)
                    # html=res.text
                    html=res.content.decode()
                    return html
                except Exception as e:
                    self.blag+=1
                    self.get_html(url)
                    print(e)
            else:
                return None
    
    
        # 解析
        def parse_html(self,url):
            html=self.get_html(url)
            if html:
                p=etree.HTML(html)
                # 基准xpath表达式
                h_list=p.xpath('//ul[@class="sellListContent"]/li')
                for h in h_list:
                    item={}
                    # 名称
                    name_list=h.xpath('.//div[@class="houseInfo"]/a/text()')
                    item['name']=name_list[0] if name_list else None
                    # 户型+面积+方位+精装
                    info_list=h.xpath('.//div[@class="houseInfo"]/text()')
                    if info_list:
                        L=info_list[0].split('|')
                        if len(L)==5:
                            item['model']=L[1].strip()
                            item['area']=L[2].strip()
                            item['direction']=L[3].strip()
                            item['perfect']=L[4].strip()
                        else:
                            item['model']=item['area']=item['direction']=item['perfect']=None
                    else:
                        item['model'] = item['area'] = item['direction'] = item['perfect'] = None
                    # 楼层+区域+总价+单价
                    floor_list=h.xpath('.//div[@class="flood"]/div[@class="positionInfo"]/text()')
                    item['floor']=floor_list[0] if floor_list else None
                    totalPrice_list=h.xpath('.//div[@class="totalPrice"]/span/text()')
                    item['totalPrice']=totalPrice_list[0]+'万' if floor_list else None
                    unitPrice_list=h.xpath('.//div[@class="unitPrice"]/span/text()')
                    item['unitPrice']=unitPrice_list[0] if floor_list else None
                    print(item)
    
        # 入口
        def run(self):
            for i in range(1,101):
                url=self.url.format(i)
                self.parse_html(url)
                time.sleep(random.uniform(1,2))
                self.blag=1
    
    
    if __name__ == '__main__':
        spider=LianJiaSpider()
        spider.run()
    

    百度贴吧图片抓取

    目标思路

    • 目标
    抓取指定贴吧所有图片
    
    • 思路
    1、获取贴吧主页URL,下一页,找到不同页的URL规律
    2、获取1页中所有帖子URL地址: [帖子链接1,帖子链接2,...]
    3、对每个帖子链接发请求,获取图片URL
    4、向图片的URL发请求,以wb方式写入本地文件
    

    实现步骤

    • 贴吧URL规律
    http://tieba.baidu.com/f?kw=??&pn=50
    
    • xpath表达式
    1、帖子链接xpath
       //div[@class="t_con cleafix"]/div/div/div/a/@href
        
    2、图片链接xpath
       //div[@class="d_post_content j_d_post_content  clearfix"]/img[@class="BDE_Image"]/@src
        
    3、视频链接xpath
       //div[@class="video_src_wrapper"]/embed/@data-video
       # 注意: 此处视频链接前端对响应内容做了处理,需要查看网页源代码来查看,复制HTML代码在线格式化
    

    代码实现

    
    

    requests.get()参数

    查询参数-params

    • 参数类型
    字典,字典中键值对作为查询参数
    
    • 使用方法
    1、res = requests.get(url,params=params,headers=headers)
    2、特点: 
       * url为基准的url地址,不包含查询参数
       * 该方法会自动对params字典编码,然后和url拼接
    
    • 示例
    import requests
    
    baseurl = 'http://tieba.baidu.com/f?'
    params = {
      'kw' : '赵丽颖吧',
      'pn' : '50'
    }
    headers = {'User-Agent' : 'Mozilla/4.0'}
    # 自动对params进行编码,然后自动和url进行拼接,去发请求
    res = requests.get(url=baseurl,params=params,headers=headers)
    res.encoding = 'utf-8'
    print(res.text)
    

    Web客户端验证参数-auth

    • 作用及类型
    1、针对于需要web客户端用户名密码认证的网站
    2、auth = ('username','password')
    
    # xpath表达式
    //a/@href
    # url 
    http://code.tarena.com.cn/AIDCode/aid1904/14-redis/
    

    思考:爬取具体的笔记文件?

    import os
    
    # 保存在: /home/tarena/redis
    # 先判断 /home/tarena/redis 是否存在
      1、不存在: 先创建目录,然后再保存 .zip
      2、存在:  直接保存 .zip
        
    # 使用频率很高
    if not os.path.exists('路径'):
          os.makedirs('路径')
    

    代码实现

    
    

    SSL证书认证参数-verify

    • 适用网站及场景
    1、适用网站: https类型网站但是没有经过 证书认证机构 认证的网站
    2、适用场景: 抛出 SSLError 异常则考虑使用此参数
    
    • 参数类型

      1、verify=True(默认)   : 检查证书认证
      2、verify=False(常用): 忽略证书认证
      # 示例
      response = requests.get(
      	url=url,
      	params=params,
      	headers=headers,
      	verify=False
      )
      

    代理参数-proxies

    • 定义
    1、定义: 代替你原来的IP地址去对接网络的IP地址。
    2、作用: 隐藏自身真实IP,避免被封。
    

    普通代理

    • 获取代理IP网站
    西刺代理、快代理、全网代理、代理精灵、... ...
    
    # 是否匿名:
    '''
    高匿:web端只能看到代理IP
    普匿:
    透明:
    '''
    
    • 参数类型
    1、语法结构
       	proxies = {
           	'协议':'协议://IP:端口号'
       	}
    2、示例
        proxies = {
        	'http':'http://IP:端口号',
        	'https':'https://IP:端口号'
    	}
    
    • 示例

    使用免费普通代理IP访问测试网站: http://httpbin.org/get

    import requests
    
    url = 'http://httpbin.org/get'
    headers = {
        'User-Agent':'Mozilla/5.0'
    }
    # 定义代理,在代理IP网站中查找免费代理IP
    proxies = {
        'http':'http://112.85.164.220:9999',
        'https':'https://112.85.164.220:9999'
    }
    html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
    print(html)
    

    思考: 建立一个自己的代理IP池,随时更新用来抓取网站数据

    1、从西刺代理IP网站上,抓取免费代理IP
    2、测试抓取的IP,可用的保存在文件中
    

    思考 - 代码实现

    
    

    写一个获取收费开放代理的接口

    
    

    私密代理

    • 语法格式
    1、语法结构
    proxies = {
        '协议':'协议://用户名:密码@IP:端口号'
    }
    
    2、示例
    proxies = {
    	'http':'http://用户名:密码@IP:端口号',
      'https':'https://用户名:密码@IP:端口号'
    }
    

    示例代码

    import requests
    url = 'http://httpbin.org/get'
    proxies = {
        'http': 'http://309435365:szayclhp@106.75.71.140:16816',
        'https':'https://309435365:szayclhp@106.75.71.140:16816',
    }
    headers = {
        'User-Agent' : 'Mozilla/5.0',
    }
    
    html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
    print(html)
    

    练习

    1、代理参数 - 如何建立自己的IP代理池,并使用随机代理IP访问网站
    2、Web客户端验证 - 如何下载、保存
    
    更多相关内容
  • I have a page that i need to get the source to use with BS4, but the middle of the page takes 1 second(maybe less) to load the content, and requests.get catches the source of the page before the secti...

    I have a page that i need to get the source to use with BS4, but the middle of the page takes 1 second(maybe less) to load the content, and requests.get catches the source of the page before the section loads, how can I wait a second before getting the data?

    r = requests.get(URL + self.search, headers=USER_AGENT, timeout=5 )

    soup = BeautifulSoup(r.content, 'html.parser')

    a = soup.find_all('section', 'wrapper')

    解决方案

    It doesn't look like a problem of waiting, it looks like the element is being created by JavaScript, requests can't handle dynamically generated elements by JavaScript. A suggestion is to use

    from bs4 import BeautifulSoup

    from selenium import webdriver

    url = "http://legendas.tv/busca/walking%20dead%20s03e02"

    browser = webdriver.PhantomJS()

    browser.get(url)

    html = browser.page_source

    soup = BeautifulSoup(html, 'lxml')

    a = soup.find('section', 'wrapper')

    Also, there's no need to use .findAll if you are only looking for one element only.

    展开全文
  • python爬虫之request.get()参数

    万次阅读 2019-10-16 09:03:57
    文章目录前情回顾目前反爬总结请求模块总结解析模块总结xpath表达式增量爬虫如何实现Chrome浏览器安装插件今日笔记链家二手房案例(xpath)百度贴吧图片抓取requests.get()参数查询参数-paramsWeb客户端验证参数-...

    前情回顾

    目前反爬总结

    • 基于User-Agent反爬
    1、发送请求携带请求头: headers={'User-Agent' : 'Mozilla/5.0 xxxxxx'}
    2、多个请求随机切换User-Agent
       1、定义列表存放大量User-Agent,使用random.choice()每次随机选择
       2、定义py文件存放大量User-Agent,使用random.choice()每次随机选择
       3、使用fake_useragent模块每次访问随机生成User-Agent
        # sudo pip3 install fake_useraget
        
        * from fake_useragent import UserAgent
        * ua = UserAgent()
        * user_agent = ua.random
        * print(user_agent)
    
    • 响应内容前端JS做处理反爬
    1、html页面中可匹配出内容,程序中匹配结果为空(html格式化)
       * 响应内容中嵌入js,对页面结构做了一定调整导致,通过查看网页源代码,格式化输出查看结构,更改xpath或者正则测试
    2、如果数据出不来可考虑更换 IE 的User-Agent尝试,数据返回最标准
    

    请求模块总结

    • urllib库使用流程
    # 编码
    params = {
        '':'',
        '':''
    }
    params = urllib.parse.urlencode(params)
    url = baseurl + params
    
    # 请求
    request = urllib.request.Request(url,headers=headers)
    response = urllib.request.urlopen(request)
    html = response.read().decode('utf-8')
    
    • requests模块使用流程
    baseurl = 'http://tieba.baidu.com/f?'
    html = requests.get(url,headers=headers).content.decode('utf-8','ignore')
    
    • 响应对象res属性
    res.text :字符串
    res.content :bytes
    res.encoding:字符编码 res.encoding='utf-8'
    res.status_code :HTTP响应码
    res.url :实际数据URL地址
    

    解析模块总结

    • 正则解析re模块
    import re 
    
    pattern = re.compile(r'正则表达式',re.S)
    r_list = pattern.findall(html)
    
    • lxml解析库
    from lxml import etree
    
    parse_html = etree.HTML(res.text)
    r_list = parse_html.xpath('xpath表达式')
    

    xpath表达式

    • 匹配规则
    1、节点对象列表
       # xpath示例: //div、//div[@class="student"]、//div/a[@title="stu"]/span
    2、字符串列表
       # xpath表达式中末尾为: @src、@href、text()
    
    • xpath高级
    1、基准xpath表达式: 得到节点对象列表
    2for r in [节点对象列表]:
           username = r.xpath('./xxxxxx')  
    
    # 此处注意遍历后继续xpath一定要以:  . 开头,代表当前节点
    

    写程序注意

    # 最终目标: 不要使你的程序因为任何异常而终止
    1、页面请求设置超时时间,并用try捕捉异常,超过指定次数则更换下一个URL地址
    2、所抓取任何数据,获取具体数据前先判断是否存在该数据,可使用列表推导式
    # 多级页面数据抓取注意
    1、主线函数: 解析一级页面函数(将所有数据从一级页面中解析并抓取)
    

    增量爬虫如何实现

    1、数据库中创建指纹表,用来存储每个请求的指纹
    2、在抓取之前,先到指纹表中确认是否之前抓取过
    

    Chrome浏览器安装插件

    • 安装方法
    # 在线安装
    1、下载插件 - google访问助手
    2、安装插件 - google访问助手: Chrome浏览器-设置-更多工具-扩展程序-开发者模式-拖拽(解压后的插件)
    3、在线安装其他插件 - 打开google访问助手 - google应用商店 - 搜索插件 - 添加即可
    
    # 离线安装
    1、下载插件 - xxx.crx 重命名为 xxx.zip
    2、输入地址: chrome://extensions/   打开- 开发者模式
    3、拖拽 插件(或者解压后文件夹) 到浏览器中
    4、重启浏览器,使插件生效
    

    今日笔记

    链家二手房案例(xpath)

    实现步骤

    • 确定是否为静态
    打开二手房页面 -> 查看网页源码 -> 搜索关键字
    
    • xpath表达式
    1、基准xpath表达式(匹配每个房源信息节点列表)
       此处滚动鼠标滑轮时,li节点的class属性值会发生变化,通过查看网页源码确定xpath表达式
      //ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]
    
    2、依次遍历后每个房源信息xpath表达式
       * 名称: './/a[@data-el="region"]/text()'
       
       # 户型+面积+方位+是否精装
       info_list = './/div[@class="houseInfo"]/text()'  [0].strip().split('|')
       * 户型: info_list[1]
       * 面积: info_list[2]
       * 方位: info_list[3]
       * 精装: info_list[4]
       
    
       * 楼层: './/div[@class="positionInfo"]/text()'
       * 区域: './/div[@class="positionInfo"]/a/text()'
       * 总价: './/div[@class="totalPrice"]/span/text()'
       * 单价: './/div[@class="unitPrice"]/span/text()'
    

    代码实现

    import requests, time, random
    from fake_useragent import UserAgent
    from lxml import etree
    
    
    class LianJiaSpider:
        def __init__(self):
            self.url = "https://zz.lianjia.com/ershoufang/pg{}/"
            self.blag=1
    
        # 随机headers
        def get_headers(self):
            agent = UserAgent().random
            headers = {"User-Agent": agent}
            return headers
    
        # 请求
        def get_html(self, url):
            #请求三次.每次请求时间最多为5秒
            if self.blag<=3:
                try:
                    res = requests.get(url=url, headers=self.get_headers(),timeout=5)
                    # html=res.text
                    html = res.content.decode()
                    return html
                except Exception as e:
                    print(e)
                    self.blag+=1
                    self.get_html(url)
    
        # 解析
        def parse_html(self, url):
            html = self.get_html(url)
            if not html:
                return None
            p = etree.HTML(html)
            # 基准xpath表达式 -30个房源节点对象列表
            h_list = p.xpath('//ul[@class="sellListContent"]/li[@class="clear LOGVIEWDATA LOGCLICKDATA"]')
            for h in h_list:
                item = {}
                # 名称
                item["name"] = (h.xpath('.//a[@data-el="region"]/text()')[0] if h.xpath('.//a[@data-el="region"]/text()') else None)
                # 户型+面积+方位+是否精装
                info_list = h.xpath('.//div[@class="houseInfo"]/text()')
                if info_list:
                    L = info_list[0].split("|")
                    if len(L) == 5:
                        item["model"] = L[1].strip()
                        item["area"] = L[2].strip()
                        item["direction"] = L[3].strip()
                        item["perfect"] = L[4].strip()
                    else:
                        item["model"] = item["area"] = item["direction"] = item["perfect"] = None
                else:
                    item["model"] = item["area"] = item["direction"] = item["perfect"] = None
    
                # 楼层
                item["floor"] = (h.xpath('.//div[@class="positionInfo"]/text()')[0] if h.xpath('.//div[@class="positionInfo"]/text()') else None)
                # 区域
                item["address"] = (h.xpath('.//div[@class="positionInfo"]/a/text()')[0] if h.xpath('.//div[@class="positionInfo"]/a/text()') else None)
                # 总价
                item["total"] = (h.xpath('.//div[@class="totalPrice"]/span/text()')[0]+"万" if h.xpath('.//div[@class="totalPrice"]/span/text()') else None)
                # 单价
                item["unit"] = (h.xpath('.//div[@class="unitPrice"]/span/text()')[0] if h.xpath('.//div[@class="unitPrice"]/span/text()') else None)
    
                print(item)
    
        # 保存
        def save_html(self):
            pass
    
        def run(self):
            for i in range(1,20):
                url=self.url.format(i)
                self.parse_html(url)
                # time.sleep(random.randint(1,3))
                #没抓取一页要初始化self.blag
                self.blag=1
    
    
    if __name__ == '__main__':
        l = LianJiaSpider()
        l.run()
    
    

    百度贴吧图片抓取

    目标思路

    • 目标
    抓取指定贴吧所有图片
    
    • 思路
    1、获取贴吧主页URL,下一页,找到不同页的URL规律
    2、获取1页中所有帖子URL地址: [帖子链接1,帖子链接2,...]
    3、对每个帖子链接发请求,获取图片URL
    4、向图片的URL发请求,以wb方式写入本地文件
    

    实现步骤

    • 贴吧URL规律
    http://tieba.baidu.com/f?kw=??&pn=50
    
    • xpath表达式
    1、帖子链接xpath
       //div[@class="t_con cleafix"]/div/div/div/a/@href
        
    2、图片链接xpath
       //div[@class="d_post_content j_d_post_content  clearfix"]/img[@class="BDE_Image"]/@src
        
    3、视频链接xpath
       //div[@class="video_src_wrapper"]/embed/@data-video
       # 注意: 此处视频链接前端对响应内容做了处理,需要查看网页源代码来查看,复制HTML代码在线格式化
    

    代码实现

    from urllib import parse
    
    import requests, time, random
    from fake_useragent import UserAgent
    from lxml import etree
    
    
    class TieBa:
        def __init__(self):
            self.url = "http://tieba.baidu.com/f?"
    
            #如果各种数据及其逻辑没有问题,则需将浏览器标识改为IE浏览器
            self.headers = {"User-Agent":'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ' }
    
        # UserAgent().random
        # 请求
        def get_html(self, url,params=None):
            html = requests.get(url=url,params=params, headers=self.headers).content.decode("utf-8", "ignore")
            return html
    
        # xpath解析
        def xpath_html(self, html, xpath_db):
            p = etree.HTML(html)
            r_list = p.xpath(xpath_db)
            return r_list
    
        # 解析+提取
        def parse_html(self, one_url,params):
            one_html = self.get_html(one_url,params)
            # print(one_html)
            xpath_db = '//div[@class="t_con cleafix"]/div/div/div/a/@href'
            # 一个页面的帖子链接(50个)
            t_list = self.xpath_html(one_html, xpath_db)
            print(t_list)
            # 完整的帖子的链接
            for t in t_list:
                t_link = "http://tieba.baidu.com" + t
                # 保存图片
                self.save_html(t_link)
    
        # 保存帖子图片
        def save_html(self, link):
            t_html = self.get_html(link)
            t_html_xpath_db = '//div[@class="d_post_content j_d_post_content  clearfix"]/img[@class="BDE_Image"]/@src'
            img_list = self.xpath_html(t_html, t_html_xpath_db)
            # 向图片链接发请求保存到本地
            for img in img_list:
                img_html = requests.get(url=img, headers=self.headers).content
                filename = img[-10:] + ".jpg"
                with open(filename, "wb") as f:
                    f.write(img_html)
                print("图片保存成功!")
                time.sleep(random.randint(1, 2))
    
        def run(self):
            name = input("贴吧名:")
            begin = input("起始页:")
            end = input("终止页:")
            for page in range(int(begin), int(end) + 1):
                # name = parse.quote(name)
    
                pn = (page-1)*50
                params={
                    "kw":name,
                    "pn":str(pn)
                }
                # url = self.url.format(name, pn)
                self.parse_html(self.url,params)
    
    
    
    if __name__ == '__main__':
        t = TieBa()
        t.run()
    
    

    requests.get()参数

    查询参数-params

    • 参数类型
    字典,字典中键值对作为查询参数
    
    • 使用方法
    1、res = requests.get(url,params=params,headers=headers)
    2、特点: 
       * url为基准的url地址,不包含查询参数
       * 该方法会自动对params字典编码,然后和url拼接
    
    • 示例
    import requests
    
    baseurl = 'http://tieba.baidu.com/f?'
    params = {
      'kw' : '赵丽颖吧',
      'pn' : '50'
    }
    headers = {'User-Agent' : 'Mozilla/4.0'}
    # 自动对params进行编码,然后自动和url进行拼接,去发请求
    res = requests.get(url=baseurl,params=params,headers=headers)
    res.encoding = 'utf-8'
    print(res.text)
    

    Web客户端验证参数-auth

    • 作用及类型
    1、针对于需要web客户端用户名密码认证的网站
    2、auth = ('username','password')
    
    • code课程方向案例
    # xpath表达式
    //a/@href
    # url 
    http://code.ta.com.cn/AIDCode/aid1904/14-redis/
    

    思考:爬取具体的笔记文件?

    import os
    
    # 保存在: /home/tarena/redis
    # 先判断 /home/tarena/redis 是否存在
      1、不存在: 先创建目录,然后再保存 .zip
      2、存在:  直接保存 .zip
        
    # 使用频率很高
    if not os.path.exists('路径'):
          os.makedirs('路径')
    

    代码实现

    import requests
    from fake_useragent import UserAgent
    from lxml import etree
    
    
    class Tarena:
        def __init__(self):
            self.url = 'http://code.tarena.com.cn/AIDCode/aid1906/14Spider/'
            # self.headers={"User-Agent":UserAgent.random}
            #需要web客户端用户名密码认证的网站
            self.auth = ("tarenacode", "code_2017")
    
        def get_html(self):
            html = requests.get(url=self.url, auth=self.auth).content.decode()
            p = etree.HTML(html)
            href_list = p.xpath('//a/@href')
            for href in href_list:
                if href.endswith(".zip") or href.endswith(",rar"):
                    self.download(href)
    
        def download(self, href):
            file_url = self.url + href
            html = requests.get(url=file_url, auth=self.auth).content
            with open(href, "wb") as f:
                f.write(html)
            print(href, "下载成功!")
    
    
    if __name__ == '__main__':
        t = Tarena()
        t.get_html()
    
    

    SSL证书认证参数-verify

    • 适用网站及场景
    1、适用网站: https类型网站但是没有经过 证书认证机构 认证的网站
    2、适用场景: 抛出 SSLError 异常则考虑使用此参数
    
    • 参数类型

      1、verify=True(默认)   : 检查证书认证
      2、verify=False(常用): 忽略证书认证
      # 示例
      response = requests.get(
      	url=url,
      	params=params,
      	headers=headers,
      	verify=False
      )
      

    代理参数-proxies

    • 定义
    1、定义: 代替你原来的IP地址去对接网络的IP地址。
    2、作用: 隐藏自身真实IP,避免被封。
    

    普通代理

    • 获取代理IP网站
    西刺代理、快代理、全网代理、代理精灵、... ...
    
    • 参数类型
    1、语法结构
       	proxies = {
           	'协议':'协议://IP:端口号'
       	}
    2、示例
        proxies = {
        	'http':'http://IP:端口号',
        	'https':'https://IP:端口号'
    	}
    
    • 示例

    使用免费普通代理IP访问测试网站: http://httpbin.org/get

    import requests
    
    url = 'http://httpbin.org/get'
    headers = {
        'User-Agent':'Mozilla/5.0'
    }
    # 定义代理,在代理IP网站中查找免费代理IP
    proxies = {
        'http':'http://112.85.164.220:9999',
        'https':'https://112.85.164.220:9999'
    }
    html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
    print(html)
    

    思考: 建立一个自己的代理IP池,随时更新用来抓取网站数据

    1、从西刺代理IP网站上,抓取免费代理IP
    2、测试抓取的IP,可用的保存在文件中
    

    思考 - 代码实现

    1、抓取西刺代理IP-国内高匿代理 - IP+端口
       https://www.xicidaili.com/nn/
    2、对抓取的IP定义为代理,测试,可用的保存到1个文件中
       timeout参数
       res.status_code == 200
    

    写一个获取收费开放代理的接口

    import requests
    url="https://www.xicidaili.com/nn/"
    # url="https://www.xicidaili.com/nn/"
    proxies={
        "http":"http://309435365:szayclhp@222.89.74.38:17714",
        "https":"https://309435365:szayclhp@222.89.74.38:17714"
    }
    headers = { 'User-Agent':'Mozilla/5.0' }
    html=requests.get(url=url,headers=headers,proxies=proxies).text
    print(html)
    

    私密代理

    • 语法格式
    1、语法结构
    proxies = {
        '协议':'协议://用户名:密码@IP:端口号'
    }
    
    2、示例
    proxies = {
    	'http':'http://用户名:密码@IP:端口号',
      'https':'https://用户名:密码@IP:端口号'
    }
    

    示例代码

    import requests
    url = 'http://httpbin.org/get'
    proxies = {
        'http': 'http://309435365:szayclhp@106.75.71.140:16816',
        'https':'https://309435365:szayclhp@106.75.71.140:16816',
    }
    headers = {
        'User-Agent' : 'Mozilla/5.0',
    }
    
    html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text
    print(html)
    

    今日任务

    1、总结前几天内容,理顺知识点
    2、代理参数 - 如何建立自己的IP代理池,并使用随机代理IP访问网站
    3、Web客户端验证 - 如何下载、保存
    
    展开全文
  • Python爬取无限滚动页面

    万次阅读 2018-06-26 23:54:36
    在本教程中,我将讨论如何使用Python抓取无限滚动页面。您将了解如何在Web开发工具中分析HTTP请求,并使用过滤器来帮助您快速找到获取真实数据的目标请求。本教程还包含两个基于Scrapy和的工作代码文件Beautifulsoup...


    在本教程中,我将讨论如何使用Python抓取无限滚动页面

    • 您将了解如何在Web开发工具中分析HTTP请求,并使用过滤器来帮助您快速找到获取真实数据的目标请求。

    • 本教程还包含两个基于Scrapy和的工作代码文件Beautifulsoup您可以比较它们以更好地理解Python世界中顶级的两个Web抓取框架。

    让我们开始吧。

    背景上下文

    如今,越来越多的网站开始用它infinite scrolling来取代经典的分页。当用户滚动到网页底部时,javascript会自动发送HTTP请求并加载新项目。你可以infinite scrolling在大多数电子商务网站和博客中看到

    人们抓取数据的最大问题infinite scrolling pages是找出用于获取新项目数据的URL

    我将以Scraping Infinite Scrolling Pages Exercise为例向您展示如何分析页面并构建蜘蛛来获取数据。

    分析网页

    我会Google Chrome在这里用作一个例子。

    首先,我们访问Scraping无限滚动页面练习,然后打开我们浏览器的Web开发工具,以帮助我们检查网站的网络流量。如果你是新手web dev tools,只是Right-click on any page element and select Inspect Element.


    正如你所看到的,一个面板显示出来让你检查网页。您可以使用Web开发工具来帮助您检查DOM元素,调试js等。

    现在我们需要找到javascript用来获取以下内容的URL,因此我们单击Network开发工具选项卡来检查访问网页时的所有HTTP请求。

    以下是您应该了解的有关网络标签的两个基本要点。

    1. 您可以输入一些关键字来过滤请求
    2. 您可以根据请求类型过滤请求,例如imageXHR

    在大多数情况下,我们关心的请求可以在XHR(XMLHttpRequest)中找到,这意味着这里有一个Ajax请求。

    因此,在您设置过滤器后XHR,请尝试滚动到底部,然后您会看到发送了一个新请求,同时将新产品加载到网页中。


    您可以检查目标请求的URL,请求标头和Cookie值

    在这里,我们可以看到下一页的网址https://scrapingclub.com/exercise/list_infinite_scroll/?page=2,下面列出了HTTP标题

    Referer:https:// scrapingclub COM / 运动/ list_infinite_scroll / 
    用户- 代理:Mozilla的/ 5.0 Macintosh上英特尔的Mac OS X 10 _10_4 为AppleWebKit / 537.36 KHTML 壁虎镀铬/ 64.0.3282.186 的Safari / 537.36 X - 要求- 搭配:XMLHttpRequest的            
    
    

    让我在这里做一个简短的分析,HTTP头中有三个值,User-Agent意味着您用来访问该页面的浏览器。我们只能专注于X-Requested-WithReferer这里。

    在我们清楚了解请求的细节后,下一步就是在代码中实现它。

    工作流程图

    大多数网页抓取教程都会讲述更多关于代码的内容,并且不太会谈论如何分析网页,但是,我相信教人们如何分析网站比直接给他们代码行更重要。

    以下是帮助您解决类似问题的工作流程图。随时下载并在必要时检查它。


    如果你看到上面的图表,你可能有点困惑Test code in shell,让我解释一下。

    有些人喜欢在完成后调试并测试蜘蛛,而这种修复方法很费时费力。在Python shell中测试代码可以确保代码按预期工作并节省大量时间。

    Scrapy解决方案

    接下来,我将尝试向您展示如何使用爬行无限滚动页面Scrapy,这是人们在Python中开发蜘蛛的第一选项。

    首先,我们使用下面的命令来创建一个scrapy项目,如果您scrapy在您的机器上安装遇到困难,您可以查看maclinuxwin的详细安装指南

    $ scrapy startproject scrapy_spider
    $ cd scrapy_spider
    

    现在我们输入scrapy shell并测试我们的代码。

    $ scrapy shell https://scrapingclub.com/exercise/list_infinite_scroll/
    

    如果你还没有安装IPython shell,那么scrapy将使用默认的python shell,但我建议你安装它IPython来为你的python shell带来更强大的功能。

    >>> from scrapy.http.request import请求
    >>> url ='https://scrapingclub.com/exercise/list_infinite_scroll/?page=2'
    >>> req =请求(url = url)
    >>> fetch(req)
    已抓取(200)<GET https://scrapingclub.com/exercise/list_infinite_scroll/?page=2>(引用者:无)
    

    我内置的要求,只有下一个URL,和它的作品!该网站没有检查useragentX-Requested-With我感觉很幸运!如果你仍然在这一步失败,你需要添加头文件,如上所述,以确保我们的蜘蛛发送的请求与发送的浏览器完全相同,这是关键!

    首先在Python shell中测试代码是最有效的方法,你应该学会如何去做

    恭喜!您已经掌握了在Python shell中分析网页和测试代码的技巧。下面我添加了整个Scrapy蜘蛛代码,以便您可以了解您是否感兴趣。你可以把文件放在scrapy_spider/spiders/infinite_scroll.py,然后运行命令scrapy crawl infinite_scroll来运行Scrapy蜘蛛。

    # -  *  - 编码:utf-8  -  *  - 
    
    from  __future__  import  print_function 
    import  json 
    import  re 
    import  logging
    
    进口 scrapy 
     scrapy.http.request  进口 请求
     spider_project.items  进口 SpiderProjectItem
    
    来自 six.moves.urllib  导入 分析
    
     List_infinite_scroll_Spider scrapy 蜘蛛):
        名称 =  “infinite_scroll”
    
        DEF  start_requests ):
            产率 请求
                URL = “https://scrapingclub.com/exercise/list_infinite_scroll/” 
                回调= 自我parse_list_page 
            
    
        def  parse_list_page self  response ):
            “”“ 
            下一页的网址就像
            https://scrapingclub.com/exercise/list_infinite_scroll/?page=2
    
            它可以在a.next页中找到
            “”“ 
            #First,检查是否下一个页面可用,如果发现,产率请求
            next_link  =  响应的xpath 
                ” //一个[@类=‘页面链接下一页’] / @ href“ extract_first ()
            if  next_link 
                #如果网站有严格的策略,你应该在这里做更多的工作
                #比如修改HTTP头
    
                #连结网址
                url  =  回应url 
                next_link  =  url [:url 找到'?'  +  next_link 
                产量 请求
                    URL = next_link 
                    回调= 自我parse_list_page 
                
    
            #找产品链接和产量要求背
             REQ   自我extract_product response ):
                yield  req
    
        def  extract_product self  response ):
            links  =  response xpath “// div [@ class ='col-lg-8'] // div [@ class ='card'] / a / @ href” 提取()
             URL   链接
                结果 =  解析里urlparse 响应URL 
                BASE_URL  =  解析urlunparse 
                    结果方案 结果netloc  “”  “”  “”  “” 
                
                url  =  parse urljoin BASE_URL  URL 
                产率 请求
                    URL = URL 
                    回调= 自我parse_product_page 
                
    
        def  parse_product_page self  response ):
            “”“ 
            产品页面使用ajax获取数据,尝试分析并
    自行完成
            ”“” 
            日志记录信息“处理”  +  响应URL 
            得到 
    

    BeautifulSoup解决方案

    由于BeautifulSoup在Python世界非常流行,所以在这里我还添加了使用BeautifulSoup的代码,供您进行比较和学习。最有趣的部分是,如果你的模式是这样的,你可以发现你可以轻松地将你的代码迁移到Scrapy。您可以将此文件保存为infinite_scroll.pypython infinite_scroll.py

    #!/ usr / bin / env python 
    # -  *  -  coding:utf-8  -  *  - 
    #vim:fenc = utf-8
    
    “””
    
    BeautifulSoup默认不支持XPath表达式,因此我们
    在这里
    使用CSS 表达式,但是您可以使用https://github.com/scrapy/parsel来编写XPath以便根据需要提取数据
    
    “”” 
     __future__  进口 print_function 
     BS4  进口 BeautifulSoup 
    进口 要求
     six.moves.urllib  进口 解析
    
    START_PAGE  =  “https://scrapingclub.com/exercise/list_infinite_scroll/”
    
    QUEUE  =  []
    
    def  parse_list_page url ):
        r  =  请求得到URL 
         =  BeautifulSoup [R 文本 “LXML” 
    
        链接 =  如果链接next_link = links [ 0 ],选择'a [class =“page-link next-page”]' 
        attrs [ 'href' ] next_link = url [:url find '?' )] + next_link QUEUE 追加parse_list_page next_link  
              
                
            
                 
            
    
        链接 =  选择'div.col-LG-8 div.card A' 
        用于 链接  链接
            product_url  =  链接attrs [ 'href' ] 
            result  =  parse urlparse url 
            base_url  =  解析urlunparse 
                结果方案 结果netloc  “” ,“”  , “”   “”  
            
            product_url  =  解析urljoin base_url  product_url 
            QUEUE append 
                parse_detail_page  product_url 
            
    
    def  parse_detail_page url ):
        #r = requests.get(url)
        #soup = BeautifulSoup(r.text,“lxml”)
        print “processing”  +  url 
    
    def  main ():
        “”“ 
        推回调方法和URL排队
        ”“” 
        QUEUE 追加
            parse_list_page  START_PAGE 
        
    
         len QUEUE ):
            call_back  url  =  QUEUE pop 0 
            call_back url 
    
    如果 __name__  ==  ' __main__ ' 
        main ()
    

    下一步是什么,你学到了什么?

    在本文中,我们使用Python构建一个蜘蛛来抓取无限滚动页面。我们学会了如何web dev tools帮助我们分析网络流量,以及如何测试代码,Scrapy shell这是我们开发蜘蛛的有效方式。

    加群:731233835   可获取10本 Python电子书


    展开全文
  • 文章目录Spider 04回顾requests.get()参数常见的反爬机制及处理方式Spider 05笔记代理参数-proxies**控制台抓包****requests.post()参数****有道翻译破解案例(post)****python中正则处理headers和formdata**民政部...
  • 常见的反爬机制及处理方式1、Headers反爬虫 :Cookie、Referer、User-Agent解决方案: 通过F12获取headers,传给requests.get()方法2、IP限制 :网站根据IP地址访问频率进行反爬,短时间内进制IP访问解决方案:1、构造...
  • requests.get # 安装request pip install requests # import requests # url = "http://www.sogou.com/web?query=周杰伦" # resp = requests.get(url) # 地址栏链接 一定是get方式提交 # print(resp) # print...
  • Python引入requests库 这里以Pycharm为开发工具(用VSCode开发也没有什么区别,主要注意引入requests库和lxml解析库),点击左上角File,选择New Project新建...分析网页代码 这里对首页右侧的所有实时新闻进行分析 可
  • 常用方法介绍 一、请求url获取基本响应对象 与我们熟悉的requests请求不同的是,requests-html默认使用session保持的请求方式,且其...基本请求网址方式:HTMLSession.get() import requests_html session...
  • from bs4 import BeautifulSoupimport urllib,sysreload(sys)sys.setdefaultencoding("utf-8")r = urllib.urlopen('https://twitter.com/ndtv').read()soup = BeautifulSoup(r)这将使我不是整个网页向下滚动我想要的...
  • 同事在网上找了一大圈,找到个js插件,但是,在网页端还好,一到手机上卡的不行 这个方法,在我看来应该不难,就用jquery的scroll就可以实现. //添加滚动条事件 mycontent为主容器,里面有滚动条,#Content为自适应的内容,在...
  • x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36", } r = requests.get(url,headers=headers) if r.status_code==200: return r.text def parse_detail(html): soup=...
  • 爬虫学习笔记,从基础到部署。

    千次阅读 2020-10-27 16:00:57
    爬虫基础知识: 笔记中出现的代码已经全部放到了github上... ... ...域名:URL–>URI包含URL的。 2.web页面的构成: ...name、status、type、size、time 3.请求方法get和post 区别:get有一个http的限制,url的长度不能超过1
  • python使用requests库和lxml库爬取网页图片
  • 使用requests-html 遇见的问题 1、解决无头浏览器问题(可能有反爬,所以需要使用模拟浏览器) 修改requests_html源码,如图所示,添加红框里的代码 示例爬虫代码: from requests_html import HTMLSession ...
  • 1. 开始Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就...
  • #内容为视频笔记及个人理解,若有错误还望各位大佬指正 requests模块 python中原生的一款基于网络请求的...response = requests.get(url=url) # 发出请求 并接收 get 所返回的响应对象 page_text = response.text .
  • 前面的实现过程通过解析网页中的连接来获取元件详细信息页面,解析出相关的数据。在实际页面中发现有很多的分页现象,通过前面的方式仅能获取第一页的内容,无法获取第二页的内容,这就造成无法爬取所有的页面,最终...
  • 目录一、安装 Splash二、Splash 的使用...异步处理多个网页的渲染过程; 获取渲染后页面的源代码或截图。 通过关闭图片渲染或者使用 Adblock 规则的方式加快页面渲染的速度; 执行特定的 JavaScript 脚本; 通过 Lua 脚
  • Python爬虫—requests模块的基本使用 基础 什么是爬虫? 就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程。 爬虫的分类 通用爬虫 抓取互联网中的一整张页面数据 聚焦爬虫 抓取页面中的...
  • Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大...
  • 文章目录初识requests_html模块使用requests_html安装基本使用发送请求解析响应获获取元素快速获取链接获取元素使用xpath使用css选择器HTML类 初识requests_html模块 感觉只要学过Python爬虫的同学应该都知道...
  • requests-html快速入门

    万次阅读 多人点赞 2018-07-15 18:10:34
    Python上有一个非常著名的HTTP库——requests,相比大家都听说过,用过的人都说好!现在requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜出来,这是一个解析HTML的库,而且用起来和requests一样...
  • '上面获取到的页面链接'+str(a) header=({'User-Agent': '在你的浏览器开发模式下获取此信息', 'Referer': '在你的浏览器开发模式下获取此信息'}) data = requests.get(url,headers=header,timeout=10) #通过...
  • Splash 是一个 JavaScript 渲染服务,是一个带有 HTTP API 的轻量级浏览器,同时它...异步方式处理多个网页渲染过程 获取渲染后的页面的源代码或截图 通过关闭图片渲染或者使用 Adblock 规则来加快页面渲染速度 可执...
  • Python3获取京东商品列表信息,并根据列表信息地址提取信息详情页的相关图片(京东商品详情信息图片采用JS动态加载,需控制网页滚动至一定位置才能加载,初始的静态页面没有商品图片),因此本文采用两种方法加载...
  • Python获取网页中动态加载的数据0、XHR 是什么?XHR是 XMLHttpRequest 对象。既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装。1、查看异步加载数据的RequestURL图片示例:2、查看图片在HTML页面中的...
  • 美好假期又要来了,追剧追番的同时,不如和我一起学学python网络爬虫吧。今天我们将一起学习如何使用Requests库抓取静态网页

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,306
精华内容 2,522
关键字:

requests.get滚动网页