Python从零开始写爬虫-6 重复抓取,代理以及总结

在前面一节中,我们终于获得了自己的离线小说, 但是也存在一些问题.

每次都重新抓取

在实际中,很难保证一次抓取就抓取到自己全部需要的网页,所以我们需要避免重复抓取.这里一般有两种策略.

  1. 确定我还有多少没有下载
  2. 确定我下载了多少
    第一种方法, 获取一次目录之后,将需要下载的章节本地保存, 然后每下载一个文件就将这条记录删除.

第二种方法, 每次运行都重新获取目录, 然后确定吧本地那些已经下载了, 取交集

我们这里选择第二种方法, 废话不多说,直接上代码.

    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内容即可.

总结

到这里, 如何最简单的爬虫的就已经全部完成了.

一个爬虫,主要涉及以下几个问题:

  1. 如何获取网页, 主要避免服务器对爬虫的限制(包括验证码, 链接限制, 登录限制, js网页), 我们这个教程没有涉及到如何避免限制, 这个要根据需要抓取的内容来的, 我们抓取的这边不需要这些内容.
  2. 解析网页, 我们使用的是正则表达式, 但是想要深入学习爬虫, 最后使用专门的库, 例如:BeautifulSoup
  3. 动态获取并且更新需要爬取的网页
  4. 保存网页, 应为这个抓取的是小说, 直接写入txt文件即可, 针对不同的数据需要使用不同的保存方式, 包括但不限于(文件, 关系型数据库, 分布式文件系统, 分布式数据库)
  5. 日志, 一个爬虫系统, 应该在其输入其工作的流程, 方便调试以及记录
posted @ 2020-02-11 16:19  CYHua  阅读(423)  评论(0编辑  收藏  举报