1. 开发环境
- Windows 10 企业版
- Pycharm 2019.01 EAP Community Edition
- Python 3.7
2. 前言
在学习python爬虫的时候,很多课程都会提到去爬取一些常规的网站进行练习。最近正好看到有个微信公众号的文章分享,我也试着做一期偏向教程的案例分享。
首先,python爬取网站的过程实际上是模拟了人浏览网页的过程,通过自动化的方法来完成操作。
然后,最轻松的爬虫即是把网页上的文字直接保存下来,不需要做过多的分析和查找过程。
因此,我们就选择爬取冷笑话的网站,通过爬取这样一个“简单”的网站理解爬虫的知识。
3.安装的库
requests
python自带的库。
re
python自带的库
BeautfulSoup
网页解析的库。
4.过程解析
4.1网站解析
首先进入笑话大全的网站:origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/'
选择笑话大全主网站上的“冷笑话”进入如下页面中。
从图中可以看出,每一个笑话不是完整的。必须点击“查看原文”才能浏览。因此这就确定了我们爬取冷笑话的思路。
在冷笑话页面找到所有的“查看全文”的超链接;再根据超链接进入详细页面中,下载每一个冷笑话。
4.2初步尝试解析网页
import requests
origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话
response = requests.get(origin_url)
print(response.text)
为了防止被反爬虫,模拟浏览器访问网站,因此要将requests
的参数中加入header
。这段文字可以反复使用,也可以根据实际情况进行调整。
关于如何引入
header
可以看参考文献
import requests
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
response = requests.get(origin_url, headers=head) # 从链接中获取到回复信息
print(response.text)
4.3解析一级网站信息
再冷笑话网页右键查看源代码可以分析网页。在箭头所指的位置找到查看全文。
从源代码中可以看出
<a target="_blank" href="/detail60/59364.html" class="all-read">查看全文»</a>
是需要提取的信息。
通过 上文中已经获得网页返回的信息response
。
那么接下来通过BeautifulSoup
对网页返回的信息进行解析。
from bs4 import BeautifulSoup
bsobj = BeautifulSoup(response.text, 'lxml') #利用bs解析
在获得bsobj
的基础上,bsobj.find_all('a')
可以找到所有的<a>
标签。但是我们需要进一步限定标签的范围,仅需要有“查找全文”关键字的标签即可,因此需要添加关键字查找。利用正则表达式查找字符串:bsobj.find_all('a',string = re.compile('查看全文'))
。
link = a_tag.get('href')
获取到所有<a>
标签中的链接地址,并存放到一个列表中。
import re
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
link = a_tag.get('href')
if link:
link_list.append(link)
4.4解析二级网站信息
由于对二级网站进行访问类似于以上所作的工作,因此将网页访问的部分改写为get_url_msg(origin_url)
的函数
def get_url_msg(origin_url):
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
response = requests.get(origin_url, headers=head) # 从链接中获取到回复信息
bsobj = BeautifulSoup(response.text, 'lxml') #利用bs解析
return bsobj
接下来首先将二级网站的链接进行重新编写,将主域名加上网站网址就获得了要爬取的网站信息。
该部分最困难的地方是找到所有的冷笑话文字并提取出来。
首先按照上面相同的办法定位文字部分:bsobj.find_all(name="div", attrs={"class" :"article-text"})
,这是根据网页的源代码进行分析出来的,找到html的类为"article-text"
然后需要将获得网页信息进行清洗,去除掉其中的所有空格,回车符号及<class> <p>
等标签。使用article_text.get_text()
获取到网页信息的所有文字。
再利用字符串操作,尽可能减少其中的其他符号。
origin_url = origin_url.split('/')
words_list = []
for link in link_list:
article_link = origin_url[0]+"//"+origin_url[2]+link
bsobj = get_url_msg(article_link)
for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
article = article_text.get_text()
article = article.replace(" ","")
#article = article.split()
re.sub("[\n]+","",article)
#print(article)
words_list.append(article)
4.5写入冷笑话信息
写入txt文档比较简单,这里要注意的是编码。
file.write(msg.encode("utf-8")
要采用UTF-8编码。
# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
desktop_path = "" # 新创建的txt文件的存放路径
full_path = desktop_path + name + '.txt' # 也可以创建一个.doc的word文档
file = open(full_path, "wb+")
file.write(msg.encode("utf-8")) # msg也就是下面的msg!
file.close()
text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg
5.源代码分享
# encoding: utf-8
"""
@version: 1.0
@author: Jarrett
@file: run.py
@time: 2020/3/18 22:12
"""
import requests
from bs4 import BeautifulSoup
import re
origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话
def get_url_msg(origin_url):
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/77.0.3865.120 Safari/537.36'}
response = requests.get(origin_url, headers=head) # 从链接中获取到回复信息
bsobj = BeautifulSoup(response.text, 'lxml') #利用bs解析
return bsobj
bsobj = get_url_msg(origin_url)
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
link = a_tag.get('href')
if link:
link_list.append(link)
origin_url = origin_url.split('/')
words_list = []
for link in link_list:
article_link = origin_url[0]+"//"+origin_url[2]+link
bsobj = get_url_msg(article_link)
for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
article = article_text.get_text()
article = article.replace(" ","")
#article = article.split()
re.sub("[\n]+","",article)
#print(article)
words_list.append(article)
# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
desktop_path = "" # 新创建的txt文件的存放路径
full_path = desktop_path + name + '.txt' # 也可以创建一个.doc的word文档
file = open(full_path, "wb+")
file.write(msg.encode("utf-8")) # msg也就是下面的msg!
file.close()
text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg
6.总结
1.利用Requests和BeautifulSoup可以轻松完成网页信息的爬取工作。
2.可以尝试爬取笑话大全网站上的其他信息,如图片和视频等。
3.接下来将把爬取下来的文字进行分词操作,做词云展示。
4.合作咨询事宜请私信。【微店】【樱桃智库】提供爬虫服务。