资讯详情

python爬虫记录

文章目录

  • # Python爬虫介绍
    • 01. Python构建虚拟环境
    • 02. 爬虫介绍
    • 03. HTTP与HTTPS
  • # urllib基本使用
    • 04.Urllib的Get和Post用法
    • 05. Urllib其他用法
    • 06. Urllib异常错误
    • 07. Urllib代理设置
    • 08. Cookie的作用
  • # Request使用
    • 09. Requests的Get和Post用法
    • 10. Requests的其他用法
  • # 正则
    • 11. 正则
    • 13. Xpath表达式
    • 练习
      • 爬斗图:[https://www.pkdoutu.com/article/list/?page=1](https://www.pkdoutu.com/article/list/?page=1)
      • 爬取链家:[https://sh.lianjia.com/chengjiao/pg1/](https://sh.lianjia.com/chengjiao/pg1/)
  • # bs4使用
    • 15. bs4
    • 16.bs4案例
    • 17.jsonpath
    • 18. 多线程爬虫
    • 20.selenium
      • 一、Selenium
      • 二、文件地址
      • 三、安装
      • 四、驱动下载
      • 五、使用
      • 六、设置代理
      • 七、添加Cookie
      • 八、显示等待
      • 九、隐式等待
      • 十、执行JS
      • 十一、设置无页面
      • 切换页面
    • 21.Scrapy
      • 一、什么是Scrapy
      • 二、Scrapy架构图
      • 三、安装
      • 四、检验
    • 后记

# Python爬虫介绍

01. Python构建虚拟环境

这里推荐使用国内源Anaconda下载安装使用,请参考以下文章:

  • ubuntu16.04安装和使用Anaconda3(详细)
  • ubuntu16.04使用anaconda创建python虚拟环境
  • ubuntu查看tensorflow使用的python解释器位置,pycharm关联

一、安装环境

sudo pip3 install virtualenv -i https://pypi.douban.com/simple/ 

二、安装virtualenvwrapper

sudo pip3 install virtualenvwrapper -i https://pypi.douban.com/simple/ 

三、配置

  • sudo vim ~/.bashrc
export WORKON_HOME=/home/ljh/.virtualenvs  export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.5  source  /usr/local/bin/virtualenvwrapper.sh 
  • source ~/.bashrc

创建虚拟环境

mkvirtualenv testlev 

五、切换虚拟环境

workon testlev 

六、关闭虚拟环境

deactivate testlev 

七、删除虚拟环境

rmvirtualenv testlev 

02. 爬虫介绍

  • 爬虫是什么?

    网络爬虫(又称网页蜘蛛,网络机器人), 它是一种程序或脚本,按照一定的规则自动捕获万维网络信息。

  • 获取数据的方法有几种

    • 用户生成数据 百度指数
    • 数据平台购买数据 聚合数据
    • 政府公开数据 统计局数据
  • 爬虫的作用

    • 数据分析
    • 购物助手
    • 咨询网站
    • 搜索引擎
  • 需要知识

    • Python 基础知识
    • HTML 基础知识
    • 数据持久化知识
    • Scrapy框架知识
  • 爬虫的分

    • 通用爬虫

      • 通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
    • 聚焦爬虫

      • 聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:
    • 不同

      • 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
  • Robots协议

    全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,

    例如:https://www.jd.com/robots.txt

03. HTTP与HTTPS

# urllib基本使用

04.Urllib的Get和Post用法

  • Decode

    • Decode的作用是将其他编码的字符串转换成unicode编码,如str.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
  • Encode

    • Encode的作用是将unicode编码转换成其他编码的字符串,如str.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。
  • Get请求

    • URL编码
    word = { 
              "wd" : "美女"}
    # 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。
    result = urllib.parse.urlencode(word) 
    print(result)
    
    • 解码
    result = urllib.parse.unquote(result)
    print(result)
    
    • 发送请求
     response = urllib.request.urlopen(request)
     print(response.read())
    
    
  • POST请求

    • # POST请求的目标URL(这个代码是之前的链接,方便我们使用,不用传递sign参数,新版中该参数是加密的)
      url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
      #构建表单数据
      formdata = { 
                  
          'i': '你好',
          'from': 'AUTO',
          'to': 'AUTO',
          'smartresult': 'dict',
          'client': 'fanyideskweb',
          'doctype': 'json',
          'version': '2.1',
          'keyfrom': 'fanyi.web',
          'action': 'FY_BY_CLICKBUTTION',
          'typoResult': 'false',
      }
      
      formdata = urllib.parse.urlencode(formdata)
      formdata = formdata.encode('utf-8')
      
      req = request.Request(url, data = formdata, headers = headers)
      #发起请求获取响应结果
      response = request.urlopen(req)
      #打印获取的响应结果
      print (response.read().decode('utf-8'))
      
  • 忽略SSL验证

    from urllib import request
    # 1. 导入Python SSL处理模块
    import ssl
    # 2. 表示忽略未经核实的SSL证书认证
    context = ssl._create_unverified_context()
    # 目标url
    url = "https://www.12306.cn/mormhweb/"
    #设置请求头
    headers = { 
              "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    #构建request对象
    request = urllib.request.Request(url, headers = headers)
    # 3. 在urlopen()方法里 指明添加 context 参数
    response = urllib.request.urlopen(request, context = context)
    html = response.read().decode()
    print (html)
    
    

05. Urllib其他用法

  • 	url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
    """ url:待解析的url scheme='':假如解析的url没有协议,可以设置默认的协议,如果url有协议,设置此参数无效 allow_fragments=True:是否忽略锚点,默认为True表示不忽略,为False表示忽略 """
    result = parse.urlparse(url=url,scheme='http',allow_fragments=True)
    print(result)
    print(result.scheme)
    
  • url_parmas = ('https', 'book.qidian.com', '/info/1004608738', '', 'wd=123&page=20', 'Catalog')
    #components:是一个可迭代对象,长度必须为6
    result = parse.urlunparse(url_parmas)
    print(result)
    """ https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog """
    
  • base_url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
    sub_url = '/info/100861102'
    full_url = parse.urljoin(base_url,sub_url)
    print(full_url)
    
    
  • parmas_str = 'page=20&wd=123'
    parmas = parse.parse_qs(parmas_str)
    print(parmas)
    """ {'page': ['20'], 'wd': ['123']} """
    
  • word = '中国梦'
    url = 'http://www.baidu.com/s?wd='+parse.quote(word)
    print(parse.quote(word))
    print(url)
    """ %E4%B8%AD%E5%9B%BD%E6%A2%A6 http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6 """
    
  • url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6'
    print(parse.unquote(url))
    """ http://www.baidu.com/s?wd=中国梦 """
    

06. Urllib异常错误

    • 来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
      • 没有网络连接
      • 服务器连接失败
      • 找不到指定的服务器
  • HTTPError

    • HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。

    • 专门用来处理HTTP请求错误,比如未认证,页面不存在等

    • 有三个属性:

      • code:返回HTTP的状态码

      • reason:返回错误原因

      • headers:返回请求头

      from urllib import request,error
      def check_error():
          """ 因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是 先捕获子类的错误,再捕获父类的错误 """
          req_url = 'https://www.baiduxxx.com/'
          try:
              response = request.urlopen(url=req_url)
              print(response.status)
          except error.HTTPError as err:
              print(err.code,err.reason,err.headers)
          except error.URLError as err:
              print('===', err.reason)
      
      

07. Urllib代理设置

我们之前一直都在使用的urlopen,它是一个特殊的opener,是模块帮我们创建好的。自定义Opener会有更高级的用法

import urllib.request
# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求
http_handler = urllib.request.HTTPHandler()
# 构建一个HTTPHandler 处理器对象,支持处理HTTPS请求
# http_handler = urllib.request.HTTPSHandler()
# 调用urllib.request.build_opener()方法,创建支持处理HTTP请求的opener对象
opener = urllib.request.build_opener(http_handler)
# 构建 Request请求
request = urllib.request.Request("http://www.baidu.com/")
# 调用自定义opener对象的open()方法,发送request请求
response = opener.open(request)
# 获取服务器响应内容
print (response.read().decode())

  • 代理设置

      • 1.,访问一些平时不能访问的站点。

      • 2.:比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

      • 3.:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。

      • 4.:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封

      • FTP代理服务器**:主要用于访问FTP服务器,一般有上传、下载的功能以及缓存的功能,端口号一般为21,2121等。**

      • HTTP代理服务器**:主要用于访问网页,一般有内容过滤和缓存的功能,端口号一般为80、8080、3128等**

      • :主要能用于访问加密的网站,一般有SSL或者TLS加密**

      • :只是单纯的用于传输数据包,不关心具体的协议用法,速度快、有缓存功能,端口号一般为1080

      • :会将数据包原封不动的转发,在服务器看来就好像真的是一个普通的用户短在访问,而记录的IP就是代理服务器的IP

      • :会在数据包上做一些改动,服务端上有可能发现这个是代理服务器,也有一定的几率追查到客户端的真实IP.

      • :不但改动了数据包,还会告诉服务器客户端的真实IP,这种代理除了用缓存技术提高浏览器速度。能用内容过滤提高安全性之外,并没有其他作用。

      • 这是爬虫/反爬虫的第二大招,通常也是最好用的。

    • 西刺免费代理IP
    • 快代理免费代理
from urllib import request,error
#构建支持代理的handler
proxy = { 
        
    'http':'61.138.33.20:808',
    'https':'120.69.82.110:44693',
}
proxy_handler = request.ProxyHandler(
    proxies=proxy
)
# 构建一个私密代理Handler,需要加上私密代理账户的用户名和密码
# authproxy = { 
        
# "http" :"username:password@61.135.217.7:80"
#}
# authproxy_handler=urllib.request.ProxyHandler(
# proxies=authproxy
#)
#根据proxy_handler实例化一个opener对象
opener = request.build_opener(proxy_handler)
url = 'http://www.baidu.com/'
# 使用https://httpbin.org/get接口验证使用了代理
# url = 'https://httpbin.org/get'
try:
    response = opener.open(url,timeout=5)
    print(response.status)
except error.HTTPError as err:
    print(err.reason)
except error.URLError as err:
    print(err.reason)
# 1. 如果按照上面代码,只有使用opener.open()方法发送
请求才使用自定义的代理,而urlopen()则不使用自定义代理。
response = opener.open(request)
# 2. 将自定义的opener设置为全局的opener,之后所有的,不管是
opener.open()还是urlopen() 发送请求,都将使用自定义代理。
# request.install_opener(opener)
# response = urlopen(request)

08. Cookie的作用

  • Cookies的作用

    • Cookies是最直接的应用就是检测用户是否已经登录
    获取到一个有登录信息的Cookie模拟登陆
    # -*- coding:utf-8 -*-
    import urllib.request
    url = 'https://www.douban.com/people/175417123/'
    #根据刚才的登录信息来构建一个已经登录过的用户的headers信息
    headers = { 
              
        'User-Agent':' Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0',
        'Host':'www.renren.com',
        'Cookie':'anonymid=jgoj4xlw-3izsk4; depovince=BJ; jebecookies=62d94404-de1f-450a-919b-a2d9f4c8b811|||||; _r01_=1; JSESSIONID=abchsGLNgne0L8_wz2Emw; ick_login=cf54f2dc-8b0b-417a-96b2-32d4051f7236; jebe_key=02cb19ad-2966-4641-8828-217160ca67a0%7Cba6f6d6ec917200a4e17a85dbfe33a4a%7C1525230975024%7C1%7C1525230982574; t=87a502d75601f8e8c0c6e0f79c7c07c14; societyguester=87a502d75601f8e8c0c6e0f79c7c07c14; id=965706174; xnsid=e1264d85; ver=7.0; loginfrom=null; wp_fold=0',
    }
    # 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象
    request = urllib.request.Request(url, headers=headers)
    # 3. 直接豆瓣个人主页(主要是Cookie信息)
    #,判断这是一个已经登录的用户,并返回相应的页面
    response = urllib.request.urlopen(request)
    # 4. 打印响应内容
    print (response.read().decode())
    
    
  • CookieJar

    • 用来储存Cookie值,存在内存中,向传出的HTTP请求添加cookie的对象。
    import http.cookiejar as cookiejar
    from urllib import parse,request
    #1.构造一个CookieJar对象实例来保存cookie
    cookie = cookiejar.CookieJar()
    # 2.使用HTTPCookieProcessor()创建cookie处理器对象,
    # 参数为CookieJar()对象
    cookie_handler = request.HTTPCookieProcessor(cookie)
    #3.通过build_opener()来构建opener
    opener = request.build_opener(cookie_handler)
    #4.addheaders接受一个列表,里面每一个元素都是一个headers信息的元组
    #opener将会附带header信息
    opener.addheaders = [
        ('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'),
    ]
    #5.需要登录账号和密码
    data = { 
              
        'source': 'index_nav',
        'form_email': '18518753265',
        'form_password': 'ljh123456',
    }
    #6. 通过urlencode()转码
    postdata = parse.urlencode(data).encode('utf-8')
    #7. 构建Request请求对象,包含需要发送的用户名和密码
    request = request.Request("https://www.douban.com/accounts/login", data = postdata)
    # 8. 通过opener发送这个请求,并获取登录后的Cookie值,
    opener.open(request)
    # 9. opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
    response = opener.open("https://www.douban.com/people/175417123/")
    #这里为了测试不添加cookie时访问改界面的效果
    #headers = { 
              
    # 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 #Firefox/59.0',
    #}
    # request = request.Request('https://www.douban.com/people/175417123/',headers=headers)
    # response = request.urlopen(request)
    # 10. 打印响应内容
    #打印结果查看是否访问成功
    print(response.code)
    html = response.read().decode('utf-8')
    # print(html)
    with open('douban_login.html','w') as f:
        f.write(html)
    
    

# Request使用

09. Requests的Get和Post用法

  • requests

    • requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多。
  • Get请求

    response = requests.get("http://www.baidu.com/")
    * response的常用方法:
        * response.text  返回解码后的字符串
        * respones.content  以字节形式(二进制)返回。
        * response.status_code  响应状态码
        * response.request.headers  请求的请求头
        * response.headers  响应头
        * response.encoding = 'utf-8'   可以设置编码类型
        * response.encoding       获取当前的编码
        * response.json()   内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
    
    
  • 添加请求头

    import requests
    kw = { 
              'wd':'美女'}
    headers = { 
              
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
    }
    # params 接收一个字典或者字符串的查询参数,
    # 字典类型自动转换为url编码,不需要urlencode()
    response = requests.get(
        "http://www.baidu.com/s?",
        params = kw, 
        headers = headers
    )
    
    • 使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码,但是也会出现乱码请求。推荐使用response.content.deocde()
    • 使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。
  • Post请求

    import requests
    req_url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    #分析表单数据
    formdata = { 
              
        'i': '老鼠爱大米',
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_CLICKBUTTION',
        'typoResult': 'false',
    }
    #添加请求头
    req_header = { 
              
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    }
    response = requests.post(
        req_url, 
        data = formdata, 
        headers = req_header
    )
    #print (response.text)
    # 如果是json文件可以直接显示
    print (response.json())
    
    

10. Requests的其他用法

锐单商城 - 一站式电子元器件采购平台