先阐述一下自己对爬虫的理解。
url即网址,每个网页都有唯一的url,浏览器输入网址(url),即是向服务器发送请求,服务器得到请求后,发送一些文件到本地(即html,css,javascrip等文件),浏览器通过解析这些文件可视化的呈现给我们,我们所看到就是浏览器将文件可视化的结果。
因此,要获取网页的内容,先就要获取网页的源码,然后在源码上定位各个标签(tag),获取标签间我们需要的内容。
原本我以为爬虫程序是不需要修改的,直到写了几个程序后才知晓,由于每个网站内的前端文件不尽相同,所以定位方法也不同,这就要求先去看网页的源代码,总结出我们需要的内容在每个网页源码中的规律性,再定位标签,获取内容。
以下是我利用bs4,与urllib库,爬取起点玄幻小说top500本的程序
import urllib.request from bs4 import BeautifulSoup filename = "C:\\Users\Administrator\Desktop\python笔记\meg.txt" for i in range(1, 26): url = "https://www.qidian.com/rank/yuepiao?chn=21&page=" + str(i) page = urllib.request.urlopen(url) contents = page.read() soup = BeautifulSoup(contents, "html.parser") for tag in soup.find_all('div', class_="book-mid-info"): name = tag.find('a').get_text() author = tag.find('a', class_='name').get_text() serialize = tag.find('span').get_text() update = tag.find('p', class_='update').get_text() update_time = update[-17:] update_contents = update[5:-18] msg = name + " " + author + " " + serialize + " " + update_contents + " " + update_time with open(filename, 'a', encoding='utf-8') as f_obj: f_obj.write(msg + '\n')
1.先是打开网址,发现共有25页,每一页就是在最后的数字上不同,所以我就用了一个简单的循环来爬取内容,每次改变最后的数字来达到访问不同网站的目的
2.在循环体重,先是调用request.urlopen的方法来打开网址,再调用read来获取内容,最后调用beautifulSoup来解析内容
最后soup就是包含网址源码的列表。
3.遍历soup列表里每本书的标签(这需要查看网页的源代码)
仔细分析网页源代码,每本书都有一个class = “book-mid-info”的标签,据此来定位每本书,再在这个标签里来定位书名,作者,连载情况,最新更新章节,最新更新时间等内容
tag主要是使用find与find_all 方法,find寻找第一个符合条件的方法,find_all寻找所有符合标签的方法,参数有name,即标签div,span,p等,然后还有class,id等来帮助定位,详细可去看beautifulsoup的文章。提一句,find可以多层使用。
定位找到的标签后,用get_text()获得内容即可。
在保存文件时,一直出错,最后发现是编码问题。以后创建文档,或新建文档,都采用‘utf-8’的编码可保证不出错。
最后我从起点上爬取了500本小说的名字,作者,是否连载,最新更新章节,最新更新时间。