爬虫学习笔记(四)——糗百爬虫遇到的反爬

#标题
系列文章目录
例如:爬虫学习笔记(三)——利用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 >爬虫程序的原理很简单,但是代码的时效性很强,可能你三个月后学,代码又失效了。这就需要我们一边学,一边把坑填上,摸着石头过河。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值