本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 。

以下文章源于白菜学python ,作者小白菜

刚接触Python的新手 、小白 ,可以复制下面的链接去免费观看Python的基础入门教学视频

https://v.douyu.com/author/y6AZ4jn9jwKW

 

 

一 、前言:

hello ,大家好 。今天为大家带来的是之前分享过的requests库与lxml库的结合使用案例一:指定百度搜索的内容并提取网页的标题内容。好的,废话不多说,直接上主菜。

二、第一步:完成初步分析

下面我们来完成我们的第一步 ,分析我们的目标 。大家可千万不要小看这一步哦,因为我们只有思路清晰才能在较短的时间里面写出漂亮的代码。

1.确定url:

首先,我们想要请求网页 ,必须知道我们的url(即网址)是什么。下面,我打开Chrome(谷歌)浏览器,并且打开百度页面 ,指定搜索“python ”,得到下图结果:

 

我们看地址一栏,得到下面的结果:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&fenlei=256&rsv_pq=e6c98fa60000b3c7&rsv_t=ff23ux%2Fo0HUBjQUrZDgdM9P%2FKpED%2BPhg%2BHbC6wUj0TJVJOIiQELff7EpXUc&rqlang=cn&rsv_dl=tb&rsv_enter=1&rsv_sug3=7&rsv_sug1=5&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&inputT=1370&rsv_sug4=2044&rsv_sug=2

 

这么长的内容其实并不是我们都需要的(当然你也可以选择不删除	,直接使用这个url,但是这个太冗长了,我就不选择这么做了)	,我们可以尝试去裁剪掉一些可能多余的字母	。

当然我们去掉一些可能多余的项也不是乱去的 ,而是得有一定的依据,这里我们打开浏览器的开发者工具,可以按快捷键F12 ,或者鼠标右击选择检查。然后选择其中的Network项,再选择Network中的第一个文件。如下图操作:

 

 

然后观察右边,将滑动条拉至底部 ,你会发现,有一个wd:python的内容,显然 ,这个就是我们搜索的内容,那么我们就要根据这个提示来删除一些不必要的东西 。

删除后得到下面的结果:

https://www.baidu.com/s?wd=python

 

然后使用这个url去访问,发现成功访问 ,好的这个就是我们需要的url。

2.确定headers参数内容:

这个简单,如果你之前看过我写的requests库教程,那么这个headers参数的确认可以直接跳过。

一般来说 ,我们写headers参数 ,优先只写User-Agent参数,当单独使用这个参数爬取失败的时候,可以考虑添加其他的headers参数 ,或者考虑是否是因为其他反爬措施的影响 。

下面以图片和文字的方式讲解去哪里获取headers参数内容:

 

 

三、第二步:完成获取页面程序主体框架

写python程序,有时候很矛盾,是用面向对象呢?还是面向过程呢?其实都随意(我比较随意 ,因为没有人要求我必须使用什么写),这里我采取面向对象的方式来写这个程序。

1.首先,我们需要写出大体的框架:

#文件一
import requests

class MySpider(object):
    def __init__(self):
        self.url = 'http://www.baidu.com/s?wd={name}' #这里采用format的格式化输入
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
        }

    def main(self):
        #处理url
        self.target = input('请输入你感兴趣的内容:')
        self.url = self.url.format(name=self.target)  #重新构建url	,大家测试的时候可以尝试打印
        #请求
        text = self.get() 
        #写入文件
        self.write(text)

    def get(self):
        '''请求并返回网页源代码'''
        pass
    
    def write(self,text):
        '''将返回的源代码写入文件,等待之后解析用'''
        pass

if __name__ == '__main__':
    spider = MySpider()
    spider.main()

 

2.为什么需要写入文件,而不直接解析:

这里有几个原因。

1>我们写代码 ,一般来说都不可能一次写成功,总是需要修改和测试的 。平时我们写代码,自然可以随意的测试运行 ,都可以检测代码是否正确 ,但是爬虫却不能这样 。因为如果你在较短时间内访问了网站次数过多,可能会导致网站对你做出一些限制性举动,比如:增加验证码判断你是否为人类 ,严重点的短时间内封禁你的ip。因此,我们将网页源代码写入文件,这样在之后写解析代码的时候就不需要重新去访问网站了。

2>我们以html的形式写入文件 ,可以用浏览器打开这个文件,可以比较清晰的看出这个文件是否为我们需要爬取的文件 。如下图是我爬取后存入的文件以谷歌浏览器打开的结果:

 

四 、完成获取页面程序:

下面我们来完成获取页面的程序代码:

1.完成请求函数get:

def get(self):
        '''请求并返回网页源代码'''
        response = requests.get(self.url,self.headers)
        if response.status_code == 200:
            return response.text

 

这个没什么好说的,是最基础的代码。

2.完成写入文件函数write:

def write(self,text):
 with open('%s.html'%self.target,'w',encoding='utf-8') as f:     #这里的self.target为输入搜索的内容
  f.write(text)

 

这个也只是文件的基本操作 ,没什么好讲解的地方,只是注意我们这里存入的为html文件,而不是txt文件。

3.检测是否正常运行以及是否为我们想要的结果:

这里检测的方式我前面已经提及 ,就是浏览器打开相应的页面即可 。如下图操作:

 

打开得到下面的结果:

 

说明程序正常运行。

五、完成解析页面的大体框架和局部内容:

1.完成解析页面程序的框架:

from lxml import etree

class Parse(object):
    def __init__(self):
        #读取内容并且初始化
        with open('python.html','r',encoding='utf-8') as f:
            self.html = etree.HTML(f.read())

    #解析页面
    def parse(self):
        pass

if __name__ == '__main__':
    parser = Parse()
    parser.parse()

 

2.完成解析函数parse:

下面我们来完成最后一步,解析函数的敲写。

首先我们需要分析下,我们想要获取的内容在什么标签里面 。分析过程如图(个人认为这部分比较重要 ,因为我初学的时候主要困惑于两点:如何处理失败的请求 ,解析的思路是什么)

 

 

 

好的,分析清楚了我们需要的内容在哪里之后,可以使用lxml来写代码了 ,如下:

def parse(self):
    #获取url
    h3_tags = self.html.xpath('//h3[contains(@class,"t")]//text()')
    h3_tags = [i.strip() for i in h3_tags]
    print(h3_tags)

 

下面要做的工作就是处理这些字符串,但是这个并不是我们的重点,并且这些数据并不重要 ,所以就不处理了。

六、总结与全文代码:

1.首先附上全文代码:

# -*- coding:utf-8 -*-

#获取网页内容文件
import requests

class MySpider(object):
    def __init__(self):
        self.url = 'http://www.baidu.com/s?wd={name}'
        #写清楚获取headers途径
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
        }

    def main(self):
        #处理url
        self.target = input('请输入你感兴趣的内容:')
        self.url = self.url.format(name=self.target)
        #请求
        text = self.get()
        #写入文件
        # self.write(text)

    def get(self):
        '''请求并返回网页源代码'''
        response = requests.get(self.url,self.headers)
        if response.status_code == 200:
            return response.text

    def write(self,text):
        with open('%s.html'%self.target,'w',encoding='utf-8') as f:
            f.write(text)

if __name__ == '__main__':
    spider = MySpider()
    spider.main()
# -*- coding:utf-8 -*-

 


#解析页面文件
from lxml import etree

class Parse(object):
    def __init__(self):
        with open('python.html','r',encoding='utf-8') as f:
            self.html = etree.HTML(f.read())

    def parse(self):
        #获取标题
        h3_tags = self.html.xpath('//h3[contains(@class,"t")]//text()')
        h3_tags = [i.strip() for i in h3_tags]
        print(h3_tags)

if __name__ == '__main__':
    parser = Parse()
    parser.parse()

 

 

2.总结:

好的,今天的分享就到此为止了。这是最基础的案例,主要目的是让大家先熟悉下 ,如何使用requests和lxml写一个爬虫程序,其次就是让大家熟悉下分析网站的思路 。

好的,谢谢大家。

文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归QU快排Www.seoGurubLog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▲61910465