爬虫基础总结

requests的简单使用:

import requests

requests是对urllib的封装,可以实现urllib的所有功能

"""
:param method: 发起什么类型的请求
:param url: 请求的目标网址
:param params: get请求后面的参数
:param data: post的表单数据
:param json:post请求的表单数据
:param headers:字典类型 请求头
:param cookies: 设置cookie信息,模拟用户请求
:param files: 使用它上传文件
:param auth: 网站认证信息:账号和密码
:param timeout:设置请求超时
:type timeout:
:param allow_redirects: 是否允许重定向
:type allow_redirects:
:param proxies: 设置代理
:param verify: 忽略证书认证,默认为true,表示不忽略, Defaults to True.
"""

url = 'http://www.baidu.com/'

url = 'http://www.xina.com/'
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'
}

req_param = {

'wd':'小明'

}

response = requests.get(url,headers=req_header)

html = response.text

如果使用response.text出现乱码,

response.content.decode('')

print(response.encoding('utf-8'))

二进制类型的数据

b_html = response.content

状态码

code = response.status_code

获取响应头

response.headers = response.headers

获取请求头

r_header = response.request.headers

获取当前请求的url的地址

current_url = response.url

response.json():可以将json字符串转为python数据类型

print(code)

post请求

以豆瓣为例子:

import requests

form_data = {
'source': 'None',
'redir': 'https://www.douban.com',
'form_email': '18518753265',
'form_password': 'ljh12345678',
'captcha-solution': 'sneeze',
'captcha-id': 'UBvcK6xu9yysO5Ef7cYJtOaL:en',
'login': '登录',
}

header = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}

url = 'https://accounts.douban.com/login'

response = requests.post(url,headers=header,data=form_data)

with open('douban.html','w') as file:
file.write(response.text)

re模块:匹配正则
re模块的导入:import re
正则表达式:是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。Regular Expression的‘Regular’一般被译为‘正则’、‘正规’、‘常规’。此处的‘Regular’既是‘规则’、‘规律’的意思,Regular Expression即‘描述某种规则的表达式’之意。简称:re
从左到右依次匹配。

导入re模块

import re

使用match方法进行匹配

result = re.match('正则表达式','要匹配的字符串')

如果上一步匹配到数据的话,可以使用group方法来提取数据

result.group()
re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。
re.match()能够匹配出以“正则表达式”开头的字符串。如果第一个字符不匹配,匹配不成功。
re.search()在‘要匹配的字符串’中筛选匹配‘正则表达式’的字符串。只要在字符串当中有匹配的就会成功,就可以返回值。只会返回从左到右的第一个,之后的不会再返回。
re.findall()与re.search()几乎相同,唯一不同的是会返回所有匹配的值。
re.sub()将匹配到的数据进行替换
re.split()根据匹配进行切割字符串,并返回一个列表
import re
ret = re.sub(r"\d+",'998',"python = 997")
print(ret)
表示字符:
单字符匹配:

     .         匹配任意一个字符(除了\n)
    [ ]        匹配中括号中列举的字符
    \d        匹配数字,即0-9
    \D        匹配非数字,既不是数字
    \s         匹配空白,即空格,tab键
    \S         匹配非空白
    \w        匹配单词字符,即a-z,A-Z,0-9,_下划线
    \W       匹配非单词字符

例如:

import re

匹配任意一个字符

ret = re.match('.','aaksbdfii')
print(ret.group())

python中的字符串前面加上r表示原生字符串,正则表达式里使用“\”作为转义字符,假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠,前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
import re
m = 'c:\a\b\c' # \一个只是转义,输出为c:\a\b\c
print(m)
ret = re.match('c:\\',m),group() # 正则表达式将用四个反斜杠转化成python中的两个反斜杠。
print(ret)

多字符匹配:

  • 匹配前一个字符出现0次或者无限次,即可有可无
  • 匹配前一个字符出现1次或者无限次,即至少有1次
    ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    {m} 匹配前一个字符出现m次
    {m,} 匹配前一个字符至少出现m次
    {m,n}匹配骗一个字符出现从m到n次

表示边界:
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词边界
\B 匹配非单词边界

表示匹配分组:
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

python正则表达式贪婪和非贪婪模式:
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量‘抓取’满足匹配最长字符串,
在“*”“?”“+”“{m,n}”后面加上?,使贪婪变成非贪婪。会要求正则匹配的越少越好。

正则.png

xpath基本语法

什么是xpath?
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

什么是xml?
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 的标签需要我们自行定义。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准

W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

写一个事例:

使用 lxml 的 etree 库

from lxml import etree
#这是一段html代码
html = """


"""

打印
  • 标签的元素集合
  • result = html.xpath('//li')

    print result  # 打印
  • 标签的元素集合 print len(result) print type(result) print type(result[0])
  • 输出结果:

    [, , , , ]
    5

    获取

  • 标签的所有 class属性
    result = html.xpath('//li/@class')

    print (result)
    

    运行结果

    ['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
    

    打印
  • 标签的元素集合
  • html = etree.parse('hello.html')
    result = html.xpath('//li/a[@href="link1"]')

    print(result)
    

    运行结果:
    []

    . 获取

  • 标签下的所有 标签
    result = html.xpath('//li//span')
    print(result)

    运行结果:
    []

    获取

  • 标签下的标签里的所有 class

    result = html.xpath('//li/a//@class')

    print(result)
    

    运行结果:
    ['blod']

    BeautifulSoup4解析器
    CSS 选择器:BeautifulSoup4

    和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

    CSS 选择器:BeautifulSoup4

    和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
    导入方式:

    from bs4 import BeautifulSoup
    

    CSS选择器

    这就是另一种与 find_all 方法有异曲同工之妙的查找方法.

    写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#

    在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

    表达式 说明
    * 选择所有节点
    #container 选择id为container的节点
    .container 选取所有class包含container的节点
    li a 选取所有li下的所有a节点
    div#container > ul 选取id为container的div的第一个ul子元素
    a[href="http://jobbole.com"] 选取所有href属性为jobbole.com值的a元素
    a[href*=”jobole”] 选取所有href属性包含jobbole的a元素
    a[href^=“http”] 选取所有href属性值以http开头的a元素
    a[href$=“.jpg”] 选取所有href属性值以.jpg结尾的a元素
    div:not(#container) 选取所有id非container的div属性
    li:nth-child(3) 选取第三个li元素
    tr:nth-child(2n) 第偶数个tr

    pyQuery解析器

    • 官方文档:https://pythonhosted.org/pyquery/index.html#
    • 中文教程:http://www.geoinformatics.cn/lab/pyquery/

    安装方法:pip3 install pyquery
    由于 pyquery 依赖于 lxml ,要先安装 lxml ,否则会提示失败。

    pip3 install lxml

    bs4.png

    实例:
    p=pq("Hello World!")

    获取相应的 HTML 块

    print (p('head').html())

    获取相应的文本内容

    print (p('head').text())

    输出:
    '''
    hello Word
    Hello World!
    '''
    d = pq(
    "

    test 1

    test 2

    "
    )

    获取
    元素内的 HTML 块

    print (d('div').html())

    获取 id 为 item-0 的元素内的文本内容

    print (d('#item-0').text())

    获取 class 为 item-1 的元素的文本内容

    print (d('.item-1').text())

    '''输出:

    test 1

    test 2


    test 1
    test 2
    '''

    d = pq(
    "

    test 1

    test 2

    "
    )

    获取第二个 p 元素的文本内容

    print (d('p').eq(1).text())

    '''输出
    test 2
    '''

    d = pq("

    test 1

    test 2

    ")

    查找
    内的 p 元素

    print d('div').find('p')

    查找
    内的 p 元素,输出第一个 p 元素

    print d('div').find('p').eq(0)

    '''输出:

    test 1

    test 2


    test 1


    '''

    d = pq("

    test 1

    test 2

    ")

    查找 class 为 item-1 的 p 元素

    print d('p').filter('.item-1')

    查找 id 为 item-0 的 p 元素

    print d('p').filter('#item-0')

    '''输出:

    test 2


    test 1


    '''

    d = pq("

    test 1

    test 2

    ")

    获取

    标签的属性 id

    print(d('p').attr('id'))

    修改 标签的 class 属性为 new

    print(d('a').attr('class','new'))

    '''输出:
    item-0
    test 2
    '''

    多线程多进程:

    实现多任务的方式:多线程,多进程,协程,多进程+多线程
    为什么能实现多任务?
    并行:同时发起,同时执行(4核,4个任务)
    并发:同时发起,单个执行

    在python语言中,并不能够真正意义上实现多线程,因为cpython解释器
    有一个全局的GIL解释器锁,来保证同一时刻只有一个线程在执行

    线程:是CPU执行的基本单元,占用的资源非常少,并且线程和线程之间的资源是共享的,
    线程是依赖进程存在的,多线程一般适用于IO密集/操作,线程的执行是无序的

    进程:是操作系统进行资源分配的节本单元,进程的执行也是无序的,每一个进程都有自己的存储空间,
    进程之间的资源不共享,多进程能够充分利用CPU,所有多进程一般适用于计算密集型操作

    爬虫基础总结_第2张图片
    1.png

    爬虫基础总结_第3张图片
    2.png

    爬虫基础总结_第4张图片
    1.png

    爬虫基础总结_第5张图片
    2.png

    Selenium
    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

    Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

    可以从 PyPI 网站下载 Selenium库https://pypi.python.org/simple/selenium , 也可以用第三方管理器 pip用命令安装:

    pip3 install selenium
    selenium 官方参考文档: http://selenium-python.readthedocs.io/index.html

    selenium中文文档: http://selenium-python-zh.readthedocs.io

    Selenium也分为有界面浏览器和无界面浏览器

    谷歌驱动(chromedriver)下载地址: http://chromedriver.storage.googleapis.com/index.html

    PhantomJS无头浏览器下载地址 无界面浏览器引擎,无界面可脚本编程的webkit浏览器引擎(目前chrom也可以支持无界面请求了) 下载地址: http://phantomjs.org/download.html API使用说明: http://phantomjs.org/api/command-line.html2.1.1

    火狐驱动下载路径(GeckoDriver):https://github.com/mozilla/geckodriver/releases (2.3.8是最新的,下载的驱动版本一定要支持你当前的浏览器版本)

    爬虫基础总结_第6张图片
    s1.png
    爬虫基础总结_第7张图片
    s2.png
    爬虫基础总结_第8张图片
    s3.png
    爬虫基础总结_第9张图片
    s4.png
    爬虫基础总结_第10张图片
    s5.png
    爬虫基础总结_第11张图片
    s6.png
  • 你可能感兴趣的:(爬虫基础总结)