爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中...

news/2024/7/19 10:11:31 标签: 爬虫, python

爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中

python36requestsbs4csvmultiprocessing">准备使用的环境和库Python3.6 + requests + bs4 + csv + multiprocessing

库的说明

  • requests模拟计算机对服务器发送requests请求
  • bs4:页面分析功能,分析页面找到所需要的特定内容
  • xlwt:把爬取的内容存入csv文件中
  • multiprocessing:开启多进程爬取

1.准备URLs

起点中文网 起点中文网的URL:https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=2 发现通过改变最后以为数字可以变换页数,由主页内容可知一共有61732页。 使用 urls = ['https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=' + str(k) for k in range(1, 61723)]这个语句可以构造一个所有连接的列表,供后面多进程使用。

在这里插入图片描述

2.使用requests库获取页面和使用bs4库来解析页面内容

  1. html = requests.get(url, headers=headers)
  2. selector = BeautifulSoup(html.text, 'lxml')
  3. names = selector.select(
  4. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > h4 > a')
  5. writers = selector.select(
  6. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a.name')
  7. sign1s = selector.select(
  8. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a:nth-child(4)')
  9. sign2s = selector.select(
  10. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a.go-sub-type')
  11. types = selector.select(
  12. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > span')
  13. traductions = selector.select(
  14. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.intro')
  15. words = selector.select(
  16. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.update > span > span')

3.把信息存储到xls中

  1. head = ['title', 'author', 'sign1', 'sign2', 'type', 'traduction', 'words']
  2. f = open('_06_qidian.csv', 'a+')
  3. csv_writer = csv.writer(f)
  4. csv_writer.writerow(head)
  5. for info in range(len(names)):
  6. csv_writer.writerow((names[info].get_text(), writers[info].get_text(), sign1s[info].get_text(), sign2s[info].get_text(), types[info].get_text(), traductions[info].get_text(), words[info].get_text()))

4.最后就可以开足马力使用多进程进行爬取了,这里使用的进程数正好是cpu核心的数量。

  1. pool = Pool(processes=multiprocessing.cpu_count())
  2. pool.map(get_info, urls)
  3. pool.close()
  4. pool.join()

5.完整代码

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt
  4. from multiprocessing import Pool
  5. import multiprocessing
  6. import csv
  7. def get_info(url):
  8. print(url)
  9. global i
  10. html = requests.get(url, headers=headers)
  11. selector = BeautifulSoup(html.text, 'lxml')
  12. names = selector.select(
  13. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > h4 > a')
  14. writers = selector.select(
  15. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a.name')
  16. sign1s = selector.select(
  17. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a:nth-child(4)')
  18. sign2s = selector.select(
  19. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > a.go-sub-type')
  20. types = selector.select(
  21. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.author > span')
  22. traductions = selector.select(
  23. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.intro')
  24. words = selector.select(
  25. 'body > div.wrap > div.all-pro-wrap.box-center.cf > div.main-content-wrap.fl > div.all-book-list > div > ul > li > div.book-mid-info > p.update > span > span')
  26. for info in range(len(names)):
  27. csv_writer.writerow((names[info].get_text(), writers[info].get_text(), sign1s[info].get_text(), sign2s[info].get_text(), types[info].get_text(), traductions[info].get_text(), words[info].get_text()))
  28. if __name__ == '__main__':
  29. head = ['title', 'author', 'sign1', 'sign2', 'type', 'traduction', 'words']
  30. f = open('_06_qidian.csv', 'a+')
  31. csv_writer = csv.writer(f)
  32. csv_writer.writerow(head)
  33. headers = {
  34. 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
  35. }
  36. urls = ['https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=' + str(k) for k in range(1, 61728)]
  37. pool = Pool(processes=multiprocessing.cpu_count())
  38. pool.map(get_info, urls)
  39. f.close()

转载于:https://www.cnblogs.com/tiandi-fun/p/10888972.html


http://www.niftyadmin.cn/n/782686.html

相关文章

谈谈 C/C++ 中的 volatile

https://zhuanlan.zhihu.com/p/33074506 文章引用自这里,直接看这篇文章就行,一下就能看懂。

gradle设置build执行命令_Gradle命令和配置

转至:http://blog.csdn.net/heqiangflytosky/article/details/50853268Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言,建议可以先熟悉一下Groovy脚本。gradle明明一般是./gr…

STM32从零开始(五)详解RCC库函数

目录 1.将RCC时钟配置重置为默认重置 其实不用单独调用,因为系统会自动运行systemInit这个函数,将时钟在启动的时候置为72mhz。具体每句话其实就是把rcc寄存器不同的位设置一下,设置的结果看手册第六章最后一节,rcc寄存器那里&a…

谈谈JVM垃圾回收机制及垃圾回收算法

一、垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念&…

vectorvn1610报价_VECTOR硬件通讯盒VN1640

VECTOR硬件通讯盒VN1640VN1600接口系列提供了对CAN(FD)和LIN网络的灵活而快速的访问。具有2个通道的VN1610 / VN1611注重比较小的尺寸和重量,而具有4个通道的VN1630A / VN1640A专为灵活性和IO支持而设计。VN1630日志提供其他记录功能。具有经过验证的CAN / LIN / J1…

关于stm32抢占优先级和子优先级中难以理解的地方

他说的是4位,我一开始理解的是0123四个数。这样一看就理解了。3位就是可以2的三次方,也就是8。而响应优先级一位,就是2的一次方。2*816,所以就是16。 这个寄存器好像在corem3内核里边,她外边没咋写。所以不用管了&…

hive中的逻辑运算符 案列_Hive 的基本运算符 及 查询

测试数据和表数据1 Bob 12002 Black 21003 BigDataBoy 5600表create table hive_db(id int,name string,money int)row format delimitedfields terminated by \t;基本查询格式select ... from ...语法格式规范HQL 语言大小写不敏感HQL 可以写一行,也可以写多行关键…

STM32从零开始(六)外部中断

先说本质 看不懂可以先跳过&#xff0c;看完后边就懂了。 NVIC就是嵌套向量中断控制器。说白了&#xff0c;就是控制一大堆中断的东西。比如外部中断&#xff0c;或者发生异常以后怎么处理的中断。 NonMaskableInt_IRQn -14, /*!< 2 Non Maskable Interrupt …