对爬虫知识的系统总结

版权声明:https://blog.csdn.net/qq_43546676 https://blog.csdn.net/qq_43546676/article/details/89296782

对爬虫知识的系统总结

一、学习时间

我从3月6号开始学习爬虫,也是在那天我写了关于爬虫的第一篇博客,到现在4月13号正式结束,总共历时1个月零7天,收获很多,下面做一下总结。

二、知识点概要

1.信息匹配
2.urllib模块的使用
3.抓包分析
4.scrapy框架的使用
5.模拟浏览器的使用
6.分布式爬虫

三、分向介绍每个知识点

1.信息匹配

我所学的信息匹配包含三个方面:正则表达式、xpath表达式和Beauitful Soup.
(1)正则表达式知识点简介:

.匹配除换行符以外的容易一个字符
*匹配前一个字符出现0次或1次或多次
?匹配前一个字符出现0次或1次
+匹配前一个字符出现1次或多次
[]匹配中括号中的任意一个元素 eg:[a-zA-Z]表示匹配所有大小写字母
|模式'或' eg:[.com|.cn] 选.com或.cn其中一个
()用来提取需要的信息 eg:'www\.(.*?)'提取出网址的域名,www.不需要
懒惰模式和贪婪模式   .*? 和 .*
{n}表示前面一个原子出现恰好n次(操作时n用具体的数字代替)
{n,}表示前面一个原子出现至少n次
{n, m}表示最少匹配 n 次且最多匹配 m 次

实际的项目例子:

#设置正则表达式
pat = '<a.*?href="(.*?)" target="_blank"'
#从csdn网页信息中匹配每个新闻的链接
links = re.compile(pat).findall(page)

实例之爬取网站QQ号
Python之爬取CSND博客
爬取糗事百科段子实战
用urllib模块爬取京东笔记本电脑的数据、并对其做一个可视化
用scrapy框架爬取腾讯新闻实战


(2)xpath表达式

1.在scrapy框架中使用xpath注意要使用extract()方法
    eg:对于parse方法中的response参数有
    item["title"] = response.xpath('//a[@name="itemlist-title"]/@title').extract()
2.在urllib中使用xpath表达式需要先安装lxml模块,使用里面的etree.HTML()方法去获取,不使用extract()方法
    eg:用xpath表达式获取百度首页的标题
    data = urllib.request.urlopen('https://www.baidu.com').read().decode('utf-8', 'ignore')
    title = etree.HTML(data).xpath('/title/text()')

实际的项目例子:
用scrapy框架爬取当当网商品信息实战将信息写入数据库
用urllib模块爬取京东笔记本电脑的数据、并对其做一个可视化


(3)Beauitful Soup
Beauitful Soup我一般用它的prettify()方法来美化爬取的网页源代码,方便我观察标签的层次结构,用来获取信息的场合不多,但是它也可以匹配信息。特别是用模拟浏览器获取网页源代码时会加载部分的js包,用prettify()方法美化网页源代码,便于观察,从而方便使用正则表达式和xpath表达式。

from bs4 import BeautifulSoup as bs
import urllib.request
data = urllib.request.urlopen('http://python.jobbole.com/').read().decode('utf-8', 'ignore')
bs1 = bs(data)
# 格式化输出
print(bs1.prettify())
# 获取标签的里的文字:bs对象.标签名.string
bs1.title.string
# 将某标签名的所有属性以列表的形式返回:bs对象.标签名.attrs
bs1.a.attrs
# 获取某标签里的某属性:bs对象.标签名['属性名']或者bs对象.标签名.get('属性名')
bs1.a['class']
bs1.a.get('class')
# 提取所有某标签,返回的是列表:bs对象.find_all('标签名')
bs1.find_all('a')
# 提取所有多个类型的所有标签,返回的是列表:bs对象.find_all(['标签名1', '标签名2'])
bs1.find_all(['a', 'div'])

2.urllib模块的使用

(1)用户代理

用户代理有两种方法
1.用Request
    response = urllib.request.Request('http://python.jobbole.com/')
    response.add_header('User-Agent', random.choice(headers)) # headers是用户代理池
    data = urllib.request.urlopen(response).read().decode('utf-8')
2.用opener
    # 设置请求报头
    header = ("User-Agent", random.choice(headers)) # headers是用户代理池
    # 创建一个opener
    opener = urllib.request.build_opener()
    # 将headers添加到opener中
    opener.addheaders = [header]headers
    # 将opener安装为全局
    urllib.request.install_opener(opener)
    # 用urlopen()方法打开网页
    data = urllib.request.urlopen(url).read().decode('utf-8')

(2)IP代理

#将IP格式化
proxy = urllib.request.ProxyHandler({'http': random.choice(ip_pool)}) # ip_pool是IP代理池
#装入IP代理
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
#将opener设置为全局
urllib.request.install_opener(opener)
#从网页爬取信息
data = urllib.request.urlopen(thisUrl).read().decode('utf-8', 'gnore')

(3)用户代理与IP代理的结合

def ua_ip(thisUrl, ip_pool):
    #构建用户代理池
    ua_pool = [
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400',
        'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)',
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
        "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
        "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
        "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
        "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
        "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
        "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
        "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
        "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
        "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
        "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
        "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
    ]
    
    thisUA = random.choice(ua_pool) #从用户代理池中随机选择一个用户代理
    thisIP = random.choice(ip_pool) #从ip代理池中随机选择一个ip代理
    print("用户代理:{}".format(thisUA))
    print("ip代理:{}".format(thisIP))
    #将IP代理格式化
    proxy = urllib.request.ProxyHandler({'http': thisIP})
    #安装IP代理,并构建开启工具
    opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
    #构造报头
    headers = ('user-agent', thisUA)
    #安装报头
    opener.addheaders = [headers]
    #将opener设置为全局
    urllib.request.install_opener(opener)
    #以二进制形式爬取信息
    respense = urllib.request.urlopen(thisUrl)
    data = respense.read()
    respense.close()    #避免持续链接导致被发现是爬虫
    return data

上面的用户代理和IP代理,


3.抓包分析

我用的是Fiddler工具进行抓包分析,抓包分析的技巧性很强,需要多做一些项目,多积累一些经验,才能找出其中网址的规律。
实际的项目:
在这里插入图片描述
抓包分析,用抓包分析爬取腾讯视频某视频所有评论


4.scrapy框架的使用

(1)进入到你所创建的scrapy爬虫项目,里面有如下几个文件:

  • spiders文件夹用来存放爬虫文件,里面的__init__.py文件为初始化文件。
  • __init__.py为初始化文件
  • items.py用来放爬取的目标,对象
  • middlewares.py是一个中间件文件,比如存放IP代理和用户代理
  • pipelines.py主要是爬取信息后的处理,比如数据是打印处理,还是存放在文件中等等

(2)items.py用来设置容器,即用来存放你获取到的信息。
(2)我们通常会在scrapy的spiders下面创建一个爬虫文件,在里面编写核心代码,该文件做为项目运行的入口点。
(3)我们在pipelines.py文件下进行数据的处理,比如,将数据写入数据库,将数据写入文件,或者直接打印出来等等。
实际的项目例子:
在这里插入图片描述
用scrapy框架爬取当当网商品信息实战将信息写入数据库
在这里插入图片描述
用scrapy框架爬取腾讯新闻实战

5.模拟浏览器的使用

模拟浏览器我使用的是Selenium + PhantomJSSelenium能够按照指定的命令自动化操作,而PhantomJS是一款无头浏览器,因此,使用Selenium + PhantomJS可以自动实现模拟人操控浏览器的情况。另外,我们把SeleniumPhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理JavaScriptCookieheaders,以及任何我们真实用户需要做的事情。
(1)用模拟浏览器使用比较多的一些方法有:

# 锁定id为a的标签
find_element_by_id(‘a’)
# 锁定name为a的标签
find_element_by_name('a')
# 通过xpath表达式锁定标签
find_element_by_xpath('xpath表达式')
# 锁定name为a的标签
find_element_by_class_name('a')
# 模拟输入关键字
driver.find_element_by_id('id名').send_keys(u'传送的文字')
# 模拟点击
driver.find_element_by_id('id名').click()
# 模拟键盘敲击
driver.find_element_by_id('id名').send_keys(操作选择)

(2)页面等待:

# 1.
    browser = webdriver.Chrome()
    browser.implicitly_wait(5)
# 2.
    time.sleep(5)

实际项目:
在这里插入图片描述
爬取MOOC课程信息并做一个可视化

四、学习过程中遇到的突出的问题

1.用urllib爬取国外网站信息总是无响应

(1)问题描述:之前,别人要我帮忙爬取一个外国的网站信息,我使用了用户代理加IP代理,然后就直接去爬,总是访问失败,报对方服务器无响应的错,但是用浏览器能够访问,只是很慢很慢。后来,我意识到可能是由于长城的原因,需要fangqiang或者下载像谷歌访问助手才能正常访问国外的网站。
(2)解决方法:我下了一个谷歌访问助手,把用户代理改成了谷歌浏览器的代理,然后就能正常访问了。

2.IP代理不稳定且没有设置超时设置导致IP被封

(1)问题描述:之前在网上找了一个免费的IP代理的网站,然后取了9个做为IP代理池,加上本地IP共10个IP,没有设置超时设置,超时设置就是每爬取一次让程序睡眠几秒钟。然后,我就准备去爬一万条数据,我吃完饭回来,发现一直显示对方服务器积极拒绝的错误,往上一翻,发现,之前网上找的IP代理爬着爬着就不能用了,后来全是用我本地的IP在爬,然后,再去爬一直爬不上去,经同学的提醒,发现IP可能被封了。不然短时间内访问太多次,容易引起对方服务器的关注,导致被拉入黑名单。
(2)解决方法:IP代理这个我真的不好说,如果要爬取很多数据的话就出点钱找点靠谱的IP代理商。超时设置我是每次间隔3秒,并且每次爬取完网页后都将响应关闭:

proxy = urllib.request.ProxyHandler({'http': thisIP})
#安装IP代理,并构建开启工具
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
#构造报头
headers = ('user-agent', thisUA)
#安装报头
opener.addheaders = [headers]
#将opener设置为全局
urllib.request.install_opener(opener)
#以二进制形式爬取信息
respense = urllib.request.urlopen(thisUrl)
data = respense.read()
respense.close()    #避免持续链接导致被发现是爬虫
time.sleep(3)
3.关于Fiddler

(1)问题描述:如果你装了抓包工具Fiddler,你会发现有时候爬取网页内容时,总是爬不上去。如果你装了Fiddler,需要考虑是不是Fiddler的影响。
(2)解决方法:
打开抓包工具Fiddler

4.关于scrapy

(1)问题描述:有一次,我用scrapy爬取某网页的内容,当时,为了方便我把数据显示放在了入口程序中,结果,发现在爬取多页信息的时候,他是从后往前爬的,先爬的最后一页。而不是我预想的先爬第一页,程序是没有错的按照第一页开始爬的。
(2)解决方法:都知道数据处理要写在pipelines.py中,下面我解释一下原因:

1.scrapy会逐一获取带yield方法中生成的结果,并判断该结果是一个什么样的类型;
2. 如果是request则加入爬取队列,如果是item类型则使用pipeline处理,其他类型则返回错误信息。
3. scrapy取到的request不会立马就去发送这个request,只是把这个request放到队列里,然后接着从生成器里获取;
4. 取尽第一部分的request,然后再获取第二部分的item,取到item了,就会放到对应的pipeline里处理;
5. 取尽队列中的request之后,函数工作结束,引擎再根据队列和pipelines中的内容去执行相应的操作;
6. 程序在取得各个页面的items前,会先处理完之前所有的request队列里的请求,然后再提取items。

可以看见request是放在队列中的,先入后出,所有会先爬最后一页,再往前爬

5.关于写入数据库

当时,我看完视频,然后去做爬取,用pymysql爬取数据写入到数据库中,发现数据写不进去,后来到网上查了一些资料,发现是因为没有用self.cursor = self.connect.cursor()self.cursor.execute(sql),直接用self.connect = pymysql.connect(host="127.0.0.1", user="root", passwd="wanghao211", db="dangdang")self.connect.commit()导致的。加上就好了,具体项目如下:
用scrapy框架爬取当当网商品信息实战将信息写入数据库(主要是对scrapy框架的熟悉和初步使用)
在这里插入图片描述
用scrapy框架爬取腾讯新闻实战

6.模拟登入和验证码处理

猜你喜欢

转载自blog.csdn.net/qq_43546676/article/details/89296782
今日推荐