更新日期:2021.03.12
本节学习内容
- 爬取网页(第一页)的源代码:初步了解 requests 的使用。
- 解析代码:初步了解 BeautifulSoup (bs4) 和 re 的使用。
- 保存信息: 先用最简单的文件类型 txt。
- 爬取,解析并保存余下的网页。
目录
- 1. 下载第一个网页的源代码
- 2. 解析代码
- 3. 保存信息
- 4. 爬取,解析并保存余下的网页
- 5. 总结
1. 下载第一个网页的源代码
需要安装 requests库
import requests
url = 'http://www.tuke88.com/soexcel/qingdan/__zonghe_0_1.shtml'
headers= {'User Agent': 'replace with your own header'}
response = requests.get(url, headers)
if response.status_code == 200: #检查状态是否正常,只有“200”代码表示正常状态
print(response.text) #如果状态不正常,需要进一步考虑怎样处理
找目标:找到一个符合爬虫小白的网页好难🙈🙈…知乎, 猫眼, 有的需要登录, 有的需要动态下载, 有的网页按F12查看源码时妥妥的,下载下来就是乱码,或者根本下载不下来。了解了爬虫进阶的知识,知道这些都是反扒手段,暂时先避开。
headers: 用于告诉服务器访问者的信息。如果不使用代理, 就直接把自己的信息填上。
怎样找到自己的headers: 打开一个网页, 右键 F12, 点击 “Network” 选项卡, 在右下侧的框里点击 “Headers” 选项卡, 在 “Request Headers” 一栏的最下面就是 “User-Agent”, 把这个copy到代码里。
使用 get 请求下载一个网页的源代码, requests.get(url, headers)。仅当状态码正常时(==200)才打印。打印后, 和网页上 “Response” 页面代码大概对比下, 应该是一样的。如果有差别, 说明这个网页还不适合作为 Hello World 来操练~~
在PyCharm运行结果里 Ctrl + F 比对一下, 都在啦~~~
2. 解析代码
需要安装 bs4 和 lxml 库
分析目标网页,以及目标信息出现的规律,确定解析工具和方法
web页面布局: 一个页面上显示了40个模板, 点击某个模板图片会弹出新窗口以供下载。页面底部有翻页按键。
网页源代码: 每对 li 标签内为一个模板的数据, 见下图。
目标信息
1) 模板名称: 在"Response" 选项卡上以第一个模板的名称 “每日工作清单” 作为关键词搜索, 恰好找到一处。然后, 使用它前面的 class=‘title jbxg’ 作为关键词搜索, 发现恰好有40个, 说明可以使用这个标准来获取模板名称。
2) 模板图片的链接: data-original 后面跟的是当前模板图片的网址。
获取当前页面上的模板名称信息
import requests
from bs4 import BeautifulSoup
url = 'http://www.tuke88.com/soexcel/qingdan/__zonghe_0_1.shtml'
headers= {'User Agent': 'replace with your own header'}
response = requests.get(url, headers)
soup = BeautifulSoup(response.text, 'lxml') # 进行bs4对象初始化,第一个参数是需要解析的源代码,第二个参数是解析器类型
for template_name in soup.find_all(class_='title jbxg'): # 根据分析,目标信息的class是'title jbxg',注意:因为class是Python的关键词,这在里另作他用时必须改一下,后面加个下划线
print (template_name.string) # 因为获取的数据不止一个,使用find_all找到并用for循环打印出来
运行结果如下
获取当前页面上的模板图片的链接信息
import re
template_links = re.findall('.*?data-original=\"(.*?)\">',response.text, re.S) # 由于知道精确的模板的链接获取方式,直接使用正则匹配
for template_link in template_links:
print(template_link)
不是故意使用正则的…本来的计划是完全使用bs4,可是做不到…
.*?: 通配符,可以表示任意数量的字符
data-original=: 精确匹配目标信息出现之前的字符~
“(.*?)”:
- (.*?): 通配符,用于适配目标信息
- 两个\": 因为目标信息(链接)前后各有一个双引号,但由于是Python的特殊字符,不能直接出现在正则表达式中,需要用反斜杠转义。
> 用于匹配目标信息之后出现的字符 “>”
re.S 使通配符可以匹配包括换行符在内的所有字符。必须加,否则一次只能匹配一行的代码。
运行结果如下:
3. 保存信息
保存为txt文件…
除了使用ctrl+F查找信息,我不知道txt文件还可以怎样使用,将就着先存一下,以后再用别的形式。
import requests
from bs4 import BeautifulSoup
import re
# 新建txt文件“template_download”, 解析出模板名称和链接并存储。
soup = BeautifulSoup(response.text, 'lxml')
with open('templates_download.txt', 'a', encoding ="utf-8") as file: # 记得encoding
for template_name in soup.find_all(class_='title jbxg'):
file.write('\n' + template_name.string) # 分行写入txt文件
template_links = re.findall('.*?data-original=\"(.*?)\">',response.text, re.S)
for template_link in template_links:
file.write('\n' + template_link)
print("template names and lists downloaded")
4. 爬取,解析并保存余下的网页
点击几次下一页,观察url的变化,两个变化。第一页是 shtml,其余都是html。翻页后网址最后一位数字 +1。一共13页,这里是练习,就爬取前5页吧。
注意sleep,不要影响人家网站~~
http://www.tuke88.com/soexcel/qingdan/__zonghe_0_1.shtml
http://www.tuke88.com/soexcel/qingdan/__zonghe_0_2.html
http://www.tuke88.com/soexcel/qingdan/__zonghe_0_3.html
完整代码
'''
爬虫学习 2021/03/12
爬取工具: requests 入门
解析工具: bs4, re 入门
存储:txt
'''
import requests
from bs4 import BeautifulSoup
import re
from requests.exceptions import RequestException # 导入异常处理工具
import time # 用于设置休眠时间
headers = {'User Agent': 'replace with your own headers'}
def get_one_page(url):
try: # 加入异常处理
html = requests.get(url, headers)
if html.status_code == 200: # 检查状态是否正常,只有"200"代码表示正常状态
html = html.text
return html
return None
except RequestException:
return None
def parse_save_one_page(html): # 使用bs4和re解析模板名称及模板图片的链接,同时存储为txt文件
soup = BeautifulSoup(html, 'lxml') # 进行bs4对象初始化,第一个参数是需要解析的源代码,第二个参数是解析器类型
with open('templates_download.txt', 'a', encoding ="utf-8") as file: # 注意:encoding
for template_name in soup.find_all(class_='title jbxg'): # 模板名称的class是'title jbxg',注意:因为class是Python的关键词,后面需加个下划线
file.write('\n' + template_name.string)
template_links = re.findall('.*?data-original=\"(.*?)\">',html, re.S) # 由于知道精确的模板图片链接获取方式,直接使用正则匹配
for template_link in template_links:
file.write('\n' + template_link)
def fetch_info():
# 单独处理第一页,因为网址后缀为shtml,和其他页都不一样
url = 'http://www.tuke88.com/soexcel/qingdan/__zonghe_0_1.shtml'
parse_save_one_page(get_one_page(url))
# 处理余下的页面
for i in range(2,6):
time.sleep(1.1) # 休息1.1秒,哈哈~~~
url = 'http://www.tuke88.com/soexcel/qingdan/__zonghe_0_'+str(i) +'.html'
parse_save_one_page(get_one_page(url))
if __name__ == '__main__':
fetch_info()
导入RequestException:负责异常处理。写程序单页爬取时不用加,要爬取多页时加进来。
运行,得到txt文件里的400行记录,数据格式很不友好,哈哈,以后再改~~
5. 总结
第一次动手写出一个完整的小小爬虫程序,用最简单的requests工具下载网页,用bs4获取目标信息,用re精准获取信息,然后用Python循环完成多页下载,最后保存~~
心情还是有点小激动,🍁🍁~~