#标题
系列文章目录
例如:爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
爬虫学习笔记(二):requests基础用法之爬取各类主流网站2
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
学习爬虫遇到最大的困难是什么,当然是从网上复制一段代码却无法运行啦。Python学习中遇到的坑真的非常多,什么PY2.0,3.0版本不兼容,PIP库无法安装,网站反爬啦,等等。今天分享学习“黑马程序员”糗百爬虫学习过程中遇到的问题,面对反爬怎么办。
提示:以下是本篇文章正文内容,下面案例可供参考
一、反爬是什么?
网络爬虫,是一个自动提取网页的程序,它为搜索引擎从网上下载网页数据,是搜索引擎的重要组成。
但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护。
于是,很多网站开始反网络爬虫,想方设法保护自己的内容。
他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片等技术,来应对网络爬虫。
二、糗百爬虫案例重现
这个爬虫的目标是爬取糗百的推荐标题,顺便爬取作者姓名。算是XPATH的一个复习内容。
1.引入库
代码如下,参考黑马程序员爬虫教程(示例):
# -*- coding: utf-8 -*-
import requests
from lxml import etree
2.主代码
代码如下,定义一个爬虫类:
class QiubaiSpider:
def __init__(self):
self.url_temp = "https://www.qiushibaike.com/8hr/page/{}/"
self.headers = {"User-Agent":......}
def get_url_list(self): #1. 构造url列表
return[(self.url_temp.format(i)) for i in range(1,14)]
def parse_url(self,url):#2.发送请求,获取响应
print(url)
response = requests.get(url,headers=self.headers)
return response.content.decode()
def get_content_list(self,html_str):
html = etree.HTML(html_str)
div_list = html.xpath("//li[contains(@id,'qiushi_tag_')]")
print(len(div_list))
content_list = []
for div in div_list:
item={}
item["content"] = div.xpath(".//a[@class='recmd-content']/text()")
item["author_name"] = div.xpath(".//span[contains(@class,'recmd-name')]/text()")
content_list.append(item)
return content_list
#重点:这个使用response.content这样返回的数据格式其实是二进制格式,然后通过decode()转换为utf-8,这样就解决了通过response.text直接返回显示乱码的问题.
def save_content_list(self,content_list):
for i in content_list:
print(i)
def run(self): #用于实现主要逻辑
url_list = self.get_url_list()
for url in url_list:
html_str = self.parse_url(url)
#2. 遍历,发送请求,获取响应
content_list = self.get_content_list(html_str)
#保存
self.save_content_list(content_list)
#3. 保存
if __name__ == '__main__':
qiubai = QiubaiSpider()
qiubai.run()
得出的结果是空数据,Pycharm没有提示错误,得出的数据为0。
三、反爬应对
User-Agent 是HTTP协议的中的一个字段, 其作用是描述发出HTTP请求的终端的一些信息。
使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
服务器通过这个字段就可以知道访问网站的是什么人。对于不是正常浏览器的用户进行屏蔽。
解决方案: 伪装浏览器的User-Agent,因为每个浏览器的User-Agent不一样,并且所有的用户都能使用浏览器。所有每次请求的时候条件浏览器的User-Agent,就能解决UA检测。
这个也就是需要我们遇到坑的时候,不停的要去网站上找解决办法,这次使用的是fake_useragent,随机生成一个useragent。
完整代码如下:
```python
# -*- coding: utf-8 -*-
import requests
from lxml import etree
from fake_useragent import UserAgent
class QiubaiSpider:
def __init__(self):
self.url_temp = "https://www.qiushibaike.com/8hr/page/{}/"
self.headers = {"User-Agent":UserAgent().random}
def get_url_list(self): #1. 构造url列表
return[(self.url_temp.format(i)) for i in range(1,14)]
def parse_url(self,url):#2.发送请求,获取响应
print(url)
response = requests.get(url,headers=self.headers)
return response.content.decode()
def get_content_list(self,html_str):
html = etree.HTML(html_str)
div_list = html.xpath("//li[contains(@id,'qiushi_tag_')]")
print(len(div_list))
content_list = []
for div in div_list:
item={}
item["content"] = div.xpath(".//a[@class='recmd-content']/text()")
item["author_name"] = div.xpath(".//span[contains(@class,'recmd-name')]/text()")
content_list.append(item)
return content_list
#重点:这个使用response.content这样返回的数据格式其实是二进制格式,然后通过decode()转换为utf-8,这样就解决了通过response.text直接返回显示乱码的问题.
def save_content_list(self,content_list):
for i in content_list:
print(i)
def run(self): #用于实现主要逻辑
url_list = self.get_url_list()
for url in url_list:
html_str = self.parse_url(url)
#2. 遍历,发送请求,获取响应
content_list = self.get_content_list(html_str)
#保存
self.save_content_list(content_list)
#3. 保存
if __name__ == '__main__':
qiubai = QiubaiSpider()
qiubai.run()
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 总结
<font color=#999AAA >爬虫程序的原理很简单,但是代码的时效性很强,可能你三个月后学,代码又失效了。这就需要我们一边学,一边把坑填上,摸着石头过河。