Python爬虫入门(四):实战,爬取4399小游戏首页

liftword4个月前 (02-06)技术文章44

本部分为爬虫入门篇的实战教程,我会用到除了selenium外所有在上文介绍过的模块来编写实例,爬取4399小游戏网站首页上的内容。

robots.txt

robots.txt是指存放在网页根目录下的一个文件,广义上也指互联网间的robots协议

robots协议

对此协议的定义存在歧义。有些资料上说robots是针对搜索引擎爬虫的,有些资料上说所有爬虫都要遵循。本文采取后者。

robots协议全称为网络爬虫排除标准(Robots Exclusion Protocol)。这个协议告诉了网络爬虫哪些网站是可以爬取的,哪些爬虫可以爬取此网站。robots协议通过在网站根目录下放置robots.txt(全部小写)文件来实现。

robots.txt 语法

robots.txt文件非常直观,一行一条规则。在这里我们简单介绍一下,只要读者能够基本看懂robots.txt就行(事实上,现在也有很多在线生成robots.txt的工具,即使你要写robots.txt也不用全学会,看看要用的就行)。

-User-Agent:允许访问的搜索引擎爬虫名,在多节时是关于此爬虫的规则。为*则所有爬虫都可以访问。

-Disallow:不允许访问的目录名,以/开头,屏蔽此目录下的所有链接,如果是一个具体的网页则是屏蔽此网页。如果单有一个/则是屏蔽所有链接。

-Allow:与Disallow规则相反。

-Sitemap:爬虫可以爬取的其他不能从网站上直接访问到的链接及其相关信息。

-Crawl-delay:抓取延迟,两次抓取之间需要等待的秒数。(貌似已经不支持了)

君子协定

可以看出,robots协议只是告知爬虫哪些网站不能爬取,并没有真正的起到阻止爬虫的作用。事实上也存在一些排除爬虫的方法,比如检查UA头、高频率访问跳出验证界面、验证码(非机器人验证,谷歌不是最喜欢这个)、使用Ajax等,但这些方法要么妨碍了允许爬取的爬虫,要么甚至妨碍到了真人用户。

为了用户以及服务器、搜索爬虫三方共同着想,robots协议事实上是一个在服务器与搜索引擎之间共同遵守的君子协议。因此,很多规则的用与否其实取决于各大搜索引擎(比如Request-rate差不多没有搜索引擎认可了),robots协议的语法一直在变化当中。

希望看到这里的读者也能够遵守robots协议,技术应该用在向上的地方。

何时需要robots协议?

很显然,需要的时候用。当你不希望某些爬虫访问某些页面时,robots协议就会派上用场。比如说百度的robots协议里其实禁止了360的爬虫(我大胆推测,因为写了很多爬虫就是没有写360,而且百度的robots.txt好像一年前就是这样了,360倒是写的很大方)。如果你希望爬虫爬取你网站的所有内容,最好直接不使用robots协议。

查看4399.com的robots.txt

4399的robots.txt文件如下所示:


User-agent: *

Disallow: /upload_pic/

Disallow: /upload_swf/

Disallow: /360/

Disallow: /public/

Disallow: /yxbox/

Disallow: /360game/

Disallow: /baidugame/

Disallow: /loadimg/

Disallow: /index_pc.htm

Disallow: /flash/32979_pc.htm

Disallow: /flash/35538_pc.htm

Disallow: /flash/48399_pc.htm

Disallow: /flash/seer_pc.htm

Disallow: /flash/58739_pc.htm

Disallow: /flash/78072_pc.htm

Disallow: /flash/130396_pc.htm

Disallow: /flash/80727_pc.htm

Disallow: /flash/151038_pc.htm

Disallow: /flash/10379_pc.htm

Disallow: /flash/188528_pc.htm

Disallow: /flash/*_pc.htm

Disallow: /index_old.htm

Disallow: /flash/188420_2.htm

Disallow: /flash/188420.htm

Disallow: /zzy/188420.htm

Disallow: /flash/209902.htm

第一行就可以看出4399的网站允许了所有爬虫,由于我们只爬取首页所以下面的Disallow不用详细看,没有/就行(事实上4399也没有拦截UA头,不知道有没有限定爬取频率,我猜没有)。

所以我们可以开始分析4399的首页了。

设定并分析目标

2020年8月25日的4399网站首页如图所示,我们把目标暂且定为大红圈内部分,获取其中的文本内容和链接:

F12检查源码得出此范围的源码在上图的小方框内,其只有一个class为middle_2。而我们需要的所有内容都在叶子节点处的span内。分析本段代码的DOM,绘图如图所示。


代码

urllib2&bs4

def lib2_bs4():

    from urllib.request import urlopen

    from bs4 import BeautifulSoup

    response=urlopen("https://www.4399.com")

    html=response.read().decode("gb2312") #因为事先看过,直接指定编码

    soup=BeautifulSoup(html,"lxml")

    for i in soup.find_all("div",class_="middle_2"): #先获取最外面的,也就是主体内容

        for m in i.find_all("span"): #我们事先查看过了,所有的span内容都需要获取

            if(m.a['href'].find("http")==-1): #大多数网站对内链都用的是相对定位

                print("https://www.4399.com"+m.a['href'])

            else: #但是我们也不能排除有外部链    

                print(m.a['href']) #获取href属性,也就是链接

            print(m.a.string) #获取文字内容

requests&lxml

def reqs_lxml():

    import requests

    from lxml import etree

    response=requests.get("https://www.4399.com")

    response.encoding="gb2312" #同上

    lhtml=etree.HTML(response.text)

    for i in lhtml.xpath("//*[@class='middle_2']/div/div/div/span"):

        if(i.xpath("a/b")!=[]): #为什么bs4里没有这个判断?因为这里仅仅有一个NavigableString(bs4里的对象)

            print(i.xpath("a/b")[0].text)

        else:    

            print(i.xpath("a")[0].text)

        if(i.xpath("a/@href")[0].find("http")==-1):

            print("https://www.4399.com",end="") #设置不换行

        print(i.xpath("a/@href")[0])

    for i in lhtml.xpath("//*[@class='middle_2']/div/div/span"): #仔细观察可以看到后面几排少了一个div嵌套    

        if(i.xpath("a/b")!=[]):

            print(i.xpath("a/b")[0].text)

        else:    

            print(i.xpath("a")[0].text)

        if(i.xpath("a/@href")[0].find("http")==-1):

            print("https://www.4399.com",end="")

        print(i.xpath("a/@href")[0])  

总结

可以很明显的看出lxml对于路径精准度的要求更高一些,再加上之前我们说过lxml速度快的优点,可以在需要精准或大量获取数据的情况下使用lxml,在其他情况用bs4相对而言要更轻松一些。至于获取响应就随意吧。

相关文章

从0教你用Python写网络爬虫,内容详细代码清晰,适合入门学习

爬虫是入门Python最好的方式之一,掌握Python爬虫之后再去学习Python其他知识点,会更加地得心应手。当然,用Python爬虫对于零基础的朋友来说还是有一定难度的,那么朋友,你真的会Pyth...

Python爬虫实战:1000图库大全,小白也能实操

今天给大家带来【爬虫实战100例】之41篇,爬虫之路永无止境。爬取目标网址:尺度有点大,遭不住...效果展示工具准备开发工具:pycharm 开发环境:python3.7, Windows11 使用工...

「2022 年」崔庆才 Python3 爬虫教程 Session + Cookie 模拟登录实战

在上一节我们了解了网站登录验证和模拟登录的基本原理。网站登录验证主要有两种实现方式,一种是基于 Session + Cookies 的登录验证,另一种是基于 JWT 的登录验证。接下来两节,我们就通过...

2024,Python爬虫系统入门与多领域实战「完结」-fx

2024,Python爬虫系统入门与多领域实战「完结」-fxxia仔ke:chaoxingit.com/5773/获取资源:上方URL获取资源Python爬虫系统入门与多领域应用探索一、引言随着互联网...

Python爬虫实战:爬取动态网页数据

现如今,Python的爬虫技术已经成为互联网数据挖掘的利器,能够从网站上抓取大量的数据,为我们分析数据提供有力的支持。本文将以实战的形式,来带大家利用Python爬虫从动态网页上获取数据。本次实战的爬...

信息量爆炸!这510页的《Python爬虫开发与项目实战》,直接膜拜

【文末有获取方式】【文末有获取方式】关于这本书本书是Python爬虫入门非常经典的一本书,无数人通过这本书入门了Python爬虫,相信你也可以。本书目录:本书总共分为三个部分:基础篇、中级篇和深入篇基...