1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 实战爬虫:python爬虫学习笔记之爬取大前端网站

实战爬虫:python爬虫学习笔记之爬取大前端网站

时间:2020-10-31 21:16:54

相关推荐

实战爬虫:python爬虫学习笔记之爬取大前端网站

本文是我在使用网易云课堂学习日月光华老师讲的“Python爬虫零基础入门到进阶实战”课程所做的笔记,如果大家觉得不错,可以去看一下老师的视频课,讲的还是很棒的。

目标:

①学会分析网站

②学会使用chrome浏览器辅助分析爬取③学会组织代码

④学会爬取基础爬虫的编写

⑤学会如何实现翻页爬取

⑥学会深层网页的爬取

⑦学会简单保存数据

编写爬虫的一般步骤:

对网站进行分析编写部分代码完善代码

爬取大前端网

1.分析网页

观察网页可以得知,每一页会显示十篇文章,共有60页。

首页的URL:

进行翻页后URL:/page/2

由此可以得知:不同的页面可以通过增加URL来进行切换。由此得到实现翻页爬取的思路:通过构造不同的URL来实现翻页爬取。

每一页共有十篇文章,每一篇文章由共同的代码结构实现,我们也是爬取一篇文章的内容,然后所有文章的爬取在循环中实现。

而如何爬取某一页一篇文章的内容呢?首先我们要打开chrome浏览器,打开大前端网。鼠标右键——检查(或者直接F12),这样就可以看到网址的源代码。

我们选择红色部分,并用其指向第一篇文章,可以获得第一篇文章的代码段。

可见,在代码部分已经进行了定位。点开定位内容,我们可以观察到,第一篇文章class=“excerpt excerpt-1”,其值在整页代码中一。。

因此,我们可以使用元素的唯一性对其进行定位爬取,然后进行后续操作。

PS:我们可以使用chrome浏览器,帮助我们获取xpath。具体操作为:右键选取某元素代码段,点击copy,点击copy XPath,即可获取该元素的xpath。此法虽好,不宜常用。不是所有浏览器都提供这个功能,该掌握的知识点还是要掌握。

当我们对某一篇文章进行爬取的时候,要使用相对xpath。如何更加便捷的获取相对xpath呢?除了可以自己查看源代码便也,我们也可以使用chrome浏览器帮我我们获得。首先获取全部文章代码的xpath,然后获取标题的xpath。二者的差异部分,即为所需的标题的相对xpath。

2.编写爬取部分内容的代码

目标:爬取60页中所有文章的题目以及发布时间

代码里面注释比较详细,就不一一说明了。

import requestsfrom lxml import etreeimport csv# 首先,定义每一页共有的url部分com_url = '/page/'# 构造循环网址(每一页的url)all_url = [com_url + str(x) for x in range(1, 61)]# 使用循环对每一页进行操作for url in all_url:# 为请求增加headers,直接使用chrome浏览器的User-Agent就可以response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})# 为每一页建立选择器,获取文本的以后,一定要把文本形式的返回值传入到选择器selector = etree.HTML(response.text)# 选择需要的内容,首先获取每一篇文章的爬取内容,然后在循环内实现全部爬取# 通过文章共有属性class的共有部分"excerpt excerpt-",获取一页所有文章# 从根目录开始查找,任何标签都可以,class属性以"excerpt excerpt-"开头# 返回的是所有文章的代码段all_article = selector.xpath('//*[starts-with(@class,"excerpt excerpt-")]')# 对每一篇文章(代码段)进行单独解析,需要使用相对xpathfor article in all_article:# 使用chrome浏览器可获取:# 当前文章xpath:/html/body/section/div[1]/div/article[1]# 标题xpath:/html/body/section/div[1]/div/article[1]/header/h2/a# 时间xpath:/html/body/section/div[1]/div/article[1]/'p[1]/time/text()# 即可获取相对xpath:header/h2/a和'p[1]/time/text()title = article.xpath('header/h2/a/text()')[0]time = article.xpath('p[1]/time/text()')[0]item = [title, time]with open('qianduan.csv', 'a') as csvfile:writer = csv.writer(csvfile)writer.writerow(item)# 输出当前爬取内容,便于查错print('正在爬取:', title)

运行结果:实现目标并将内容存储在CSV文件中。

3.完善代码内容

可以将不同功能模块的代码封装成一个函数,然后在主程序中直接调用函数。使得整体代码更加清晰,并且更易维护。

①爬取文章内容详细内容

思路:爬取文章链接,访问链接,下载内容。

②下载文章对应图片

思路:爬取文章地址,通过请求网址下载图片至本地。

import requestsfrom lxml import etreeimport csvdef csv_writer(item):"""保存函数,如果有错误,就打印错误newline=''的作用是csv文件打开的时候不要插入空格:param item: 列表,存储的每一篇文章爬取的内容"""with open('qianduan.csv', 'a', encoding='utf-8', newline='') as csvfile:writer = csv.writer(csvfile)try:writer.writerow(item)except Exception as e:print('保存错误:', e)print('正在爬取:', item[0])def spider(url_):"""爬虫函数,爬取网址。便于代码复用。:param url_:请求爬取的网址:return: 返回由爬取结果文本形式源代码所构造的选择器"""response = requests.get(url_, headers=headers)return etree.HTML(response.text)def parse_detail(detail_url):"""解析某一篇文章:param detail_url:文章地址:return: 文章全部文本"""sel = spider(detail_url)return sel.xpath('string(//*[@class="article-content"])')def download_image(img_url, img_name):"""下载图片:param img_url: 图片地址:param img_name: 图片名"""# 得到图片的二进制源码img = requests.get(img_url, headers=headers).contentwith open(img_name + '.png', 'wb') as f:f.write(img)def parse(list_url):selector = spider(list_url)all_article = selector.xpath('//*[starts-with(@class,"excerpt excerpt-")]')for article in all_article:title = article.xpath('header/h2/a/text()')[0]time = article.xpath('p[1]/time/text()')[0]detail_url = article.xpath('header/h2/a/@href')[0]content = parse_detail(detail_url)csv_writer([title, time, content])img_url = article.xpath('a/img/@data-src')[0]img_name = article.xpath('a/img/@alt')[0]download_image(img_url, img_name)com_url = '/page/'all_url = [com_url + str(x) for x in range(1, 2)]headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}for url in all_url:parse(url)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。