python之爬取起点中文网
最近学了爬虫,想实战一下就选取了最近经常看小说的起点中文网来进行爬取
过程如下:
-
分析爬取信息:
爬取网址:https://www.qidian.com/rank?chn=-1
爬取内容:
如上图有不同的分类,有奇幻,玄幻,武侠等分类,我们需要爬取每个分类里的各个排行榜的书名信息和排名信息
分析网页HTML文本:
在页面HTML源码中找到排行榜内书名和排名所在的位置,分析这些信息在HTML内的结构 -
准备的python库工具:
import requests import pymongo from pyquery import PyQuery as pq from urllib.parse import urlencode
requests请求库,用来发起页面请求,并获取返回的页面html文本
pymongo库用来连接MongoDB数据库,操作数据库并存储数据
pyquery库用来解析HTML文本,定位信息所在的节点,并获取信息
urllib.prase库中的urlencode是用来在url后面添加参数,构造请求的url的
3.代码分析:
-
请求页面函数部分
def get_page(chn): params = { 'chn':chn } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Host':'www.qidian.com', } #把params参数通过urlencode参数添加到url上 url = 'https://www.qidian.com/rank?' + urlencode(params) try: response = requests.get(url,headers=headers) #请求url 获取响应 if response.status_code == 200: return response.text #若响应状态码为200,则返回页面html内容 except Exception: print('Error') ```
-
获得页面的HTML文本后解析内容爬取想要的信息
def get_data(page_html,chn): 获得页面的HTML文本后解析内容爬取想要的信息 :param page_html: 页面的源码 :param chn: 页码数 :return: 页面的详细信息 page_info = {} list_info = [] doc = pq(page_html) rank_list_row = doc('.rank-list').items() #获取书的排名 for item in rank_list_row: list_info_ = get_detial_info(item) list_info.append(list_info_) #获书的分类 book_sort = doc('.type-list p a').items() for item in book_sort: if chn == int(item.attr('data-chanid')): page_info[item.text()] = '{info}'.format(info=list_info) #把书的排名和书的分类通过字典键值保存起来 break return page_info ```
-
获取各个排行榜的数据
def get_detial_info(rank_list): ''' 获取页面各个排行榜的书的排名 :param rank_list: 页面的每个排行榜的不同书的排名 :return: 排名信息 ''' list_info = {} book_info = [] list_name = rank_list.find('.wrap-title').text()[:-3] #对获取的字符串进行切片处理,获取书名 book_list = rank_list.find('li').items() #获取书在各个排行榜的排名 for item in book_list: book_info_=get_book_info(item) book_info.append(book_info_) list_info[list_name] = '{info}'.format(info=book_info) #把书的排名和书的名字通过字典键值存储 return list_info
-
获取书的信息
def get_book_info(book_list): ''' 获取书名,和书的在各个排行榜的排名 :param book_list: 页面各个排行榜的html文本 :return: 书名和排名 ''' book_rank = book_list.attr('data-rid') book_name = book_list.find('a').text() return { '排名':book_rank, '书名':book_name, }
-
把信息存储到MongDB上去:
#连接MongDB数据库,创建集合进行存储信息 client = pymongo.MongoClient(host='localhost',port=27017) DB = client['Novel'] collection = DB['Novel_Rank'] def save_to_db(data): ''' 把爬取信息存储到mongoDB上 :param data: 爬取信息 :return: ''' result = collection.insert_one(data) print('save succeed')
-
主函数调用:
def main(): ''' 主函数 :return: ''' for i in range(1,23): #遍历页码 text = get_page(i) page_info = get_data(text,i) if page_info: #如果获取到的字典内有内容则储存 save_to_db(page_info) if __name__ == '__main__': main() ```
4. 爬取结果:
数据库内存储的信息
每个分类的排行榜信息:
这就完成对于起点中文网的内容爬取啦,对于写的错误和不好的地方大家可以在评论留言,我看到了会及时回复,谢谢大家