在前面一节中,我们终于获得了自己的离线小说, 但是也存在一些问题.
每次都重新抓取
在实际中,很难保证一次抓取就抓取到自己全部需要的网页,所以我们需要避免重复抓取.这里一般有两种策略.
确定我还有多少没有下载
确定我下载了多少
第一种方法, 获取一次目录之后,将需要下载的章节本地保存, 然后每下载一个文件就将这条记录删除.
第二种方法, 每次运行都重新获取目录, 然后确定吧本地那些已经下载了, 取交集
我们这里选择第二种方法, 废话不多说,直接上代码.
import os
def getExist(path):
dirs = os.listdir(path)
return set(file[:-4] for file in dirs) # 删除后缀, 使用set保存
修改抓取代码
contents = getContents(url)
i = 1
exist = getExist('novel') # 'novel'为保存目标
for url, title in contents:
if title in exist: continue
threading.Thread(name='t1', target=craw, args=(url, title)).start()
i = i + 1
if i % 100 == 0: time.sleep(10)
这样就可以很简单的避免重复抓取.
代理
使用单个ip不断的抓取网页, 很可能出现无法获取网页的代码, 网站返回的code为503.这个时候我们需要使用代理.大家可以在下面获取免费的ip
获取的代理其实就是ip地址加一个端口号, 格式为: xx.xx.xx.xx:xxxx, 假设获取的道理的代理为proxy.
将我们获取网页代码修改为 r = requests.get(url, proxies={"http": 'http://' + proxy, "https": 'https://' + proxy}) # 通过代理,获得html内容即可.
总结
到这里, 如何最简单的爬虫的就已经全部完成了.
一个爬虫,主要涉及以下几个问题:
如何获取网页, 主要避免服务器对爬虫的限制(包括验证码, 链接限制, 登录限制, js网页), 我们这个教程没有涉及到如何避免限制, 这个要根据需要抓取的内容来的, 我们抓取的这边不需要这些内容.
解析网页, 我们使用的是正则表达式, 但是想要深入学习爬虫, 最后使用专门的库, 例如:BeautifulSoup
动态获取并且更新需要爬取的网页
保存网页, 应为这个抓取的是小说, 直接写入txt文件即可, 针对不同的数据需要使用不同的保存方式, 包括但不限于(文件, 关系型数据库, 分布式文件系统, 分布式数据库)
日志, 一个爬虫系统, 应该在其输入其工作的流程, 方便调试以及记录