前言
在了解了python的语法之后,我就开始尝试写第一个爬虫,并且在网上也找了很多教程,发现有几个模块在Python爬取网页时,特别常用,例如:
BeautfulSoup
,Requests
,csv
,re
。BeautfulSoup
是一个方便解析html的模块,具体使用可以看Beautiful Soup 4.2.0 中文文档。Requests
是一个模拟发送请求的模块,具体使用可看Requests的开发接口。关于后两个是Python
自带的模块,cvs
的作用是数据的储存,一般是.cvs
文件,re
是Python
中的正则表达式模块,一般用于对数据的再处理,两者的具体使用可看The Python Standard Library。
网页爬虫流程
在了解了爬虫需要的模块后,我们就来学习一下,做一个简单的网页爬虫的流程一般是什么:
在这里我们的小程序的流程基本上是一致的。
爬虫
至于爬什么网站,我选择了爬取简书,你也可以选取其他一些网站,像知乎,豆瓣等等。在简书中有个模块是@IT·互联网,我们就选择它了,在它之中有个“热门”选项,我们就来爬取它其中的内容,获取热门文章的“题目”,“阅读人数”,“链接地址”,“评论条数”,“喜欢人数”,“打赏人数”,这样我们就可以通过文章的“阅读人数”,“评论条数”,“喜欢人数”,“打赏人数”选择排序,选择更加有价值的文章阅读。
打开“开发者工具”,在“network”下会点击“热门”,第一个里面就包含请求的url
地址http://www.jianshu.com/c/V2CqjW?order_by=top
。
清空network中的信息,我们再滑动滚动条,因为是ajax
请求,所以我们会在XHR
选项发现一个带有参数的url
地址http://www.jianshu.com/c/V2CqjW?order_by=top&page=2
,后面的page=2
就是我们需要自己设置的,可以让它递增,获取更多内容。
接下来我们因为需要用BeautfulSoup
的通过css样式获取html的方法,所以我们需要找到定位的位置,获取它的css样式。这时我们需要打开Elements
选项卡,获取到查询信息的css样式,其中每个li
标签都是一篇文章。
接下来我们就来编写程序了,编写顺序可按照以下步骤进行:
- 建存储文件
- 设置正则表达式(只要数字)
- 提供url地址
- 设置css选择器
- 发请求,解析html
- 得到特定信息
- 写入文件
- 关闭文件
具体代码如下:
from tinydb import TinyDB
import csv
#建存储文件
db = TinyDB('collection_cxy_hot2.json')
csvfile = open("cxy_hot2.csv", "w", encoding='utf-8')
fieldnames = ["title", "href", "people", "commmit", "like", "money"]#设置表头
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
import requests
from bs4 import BeautifulSoup
import re
reg = re.compile('(\d+)')#设置正则表达式,只要数字
#提供url地址
base_url = "http://www.jianshu.com"
hot_url="http://www.jianshu.com/c/V2CqjW?order_by=top&page=%d"
add_url=1
#设置css选择器
title_selector = "#list-container .title"
people_selector = "div[class='meta'] > a"
commit_selector = "div[class='meta'] > a"
like_selector = "div[class='meta'] > span"
money_selector = "div[class='meta'] > span"
while(add_url < 300):
try:
#发请求,解析html
first_page = requests.request('get', hot_url% add_url).content
soup = BeautifulSoup(first_page, "lxml")
#得到特定信息
collection_total = [i.get_text() for i in soup.select(title_selector)]
if not collection_total : break#没信息时,break
print(collection_total)
collection_href = [(base_url+i.get('href')) for i in soup.select(title_selector)]
collection_pepele = [int(reg.findall(i.get_text())[0]) for i in soup.select(people_selector)][::2]#获取奇数项
collection_commit = [int(reg.findall(i.get_text())[0]) for i in soup.select(commit_selector)][1::2]#获取偶数项
collection_like = [int(reg.findall(i.get_text())[0]) for i in soup.select(like_selector)][::2]
collection_money = [int(reg.findall(i.get_text())[0]) for i in soup.select(money_selector)][1::2]
for c,d,e,f,g,h in zip(collection_total, collection_href, collection_pepele, collection_commit, collection_like, collection_money):
collection_dict = {"title":c, "href":d, "people":e, "commmit":f, "like":g, "money":h}
#写入文件
db.insert(collection_dict)
writer.writerow(collection_dict)
add_url += 1#爬下一页
except Exception as t:
print(t)
break
csvfile.close()#关闭文件
然后执行爬虫,验证结果,结果正确。
得到的.csv
文件可能用Excel
打开会乱码,所以在这里提供一个可以将.json
文件转为格式良好的.csv
文件的网站:JSON to CSV Converter Online,把.json
文件传上去,下载下来即可。
我们打开下载文件,就可以通过“阅读人数”,“评论条数”,“喜欢人数”,“打赏人数”选择排序,选择更加有价值的文章阅读了。
至此一个简单的爬虫小程序就完成了。
后续
因为这是我的第一个爬虫程序,代码之中难免会有些选取规则不合适或命名不规范,希望大家能够多多包涵,多多指正。