今天逛微信朋友圈弹出了一个小说广告,点进去,唉,还好看耶,只看了前面两章就要下载app看,于是转战百度看,这百度上面的盗版小说网十分没素质
全是广告也算了,点击下一页跳转到其他网站的广告,必须返回目录才能看下一章
简单看了下目录,所有的章节和URL都返回到页面上,那简单了
多线程或异步有个问题就是返回的顺序是乱的,这样看不了,单线程是行,总还是想折腾下,于是就百度搜了下如何多线程顺序返回
https://blog.csdn.net/anyikang3511/article/details/102423444
恩,就是抄的这篇写的
基本思路是在爬取时添加上一个index ,依次加1,写入时根据等于1写入后自加1,然后返回包不等于2的就阻塞,是2的就写入,然后是3
import requests
import time
from lxml import etree
from threading import Thread
from queue import Queue
def page(url):
resp=requests.get(url).text
tree = etree.HTML(resp)
text=tree.xpath('//div[@id="content"]//text()')
text=''.join(text)
text=text.replace('\\xa0','').replace("'",'').replace(' 喜欢都市战婿归来请大家收藏:()都市战婿归来更新速度最快。, \\t\\t\\t\\t\\n, chaptererror();, \\n\\t\\t\\t\\t','').replace('[','').replace(']','')
return text
class MyThread(Thread):
def __init__(self,q):
Thread.__init__(self)
self.q = q
def run(self):
global index
while not self.q.empty():
data=self.q.get()
url=''.join(data[1])
print(url)
response=requests.get(url=url).text
tree = etree.HTML(response)
title=tree.xpath('//h1/text()')[0]
text = tree.xpath('//div[@id="content"]//text()')
text = '\n'.join(text)
text = text.replace('\\xa0', '').replace("'", '').replace(' 喜欢都市战婿归来请大家收藏:()都市战婿归来更新速度最快。, \\t\\t\\t\\t\\n, chaptererror();, \\n\\t\\t\\t\\t', '').replace('[','').replace(']', '')
text=text.replace('chaptererror();','').replace('喜欢都市战婿归来请大家收藏:()都市战婿归来更新速度最快。','')
while data[0] > index +1:
pass
if data[0] == index+1:
print(f'保存{title}->{text}')
f.write('\n'+title+'\n')
f.write(text)
index +=1
if __name__ == '__main__':
index=-1
url='http://www.newbixia.com/book/122/a122939/'
resp = requests.get(url).text
tree=etree.HTML(resp)
zj_list=tree.xpath('//div[@id="list"]/dl/dd')[12:]
print(len(zj_list))
page_urls=[]
for i in zj_list:
name=i.xpath('./a/text()')[0]
page_url='http://www.newbixia.com'+i.xpath('./a/@href')[0]
page_urls.append(page_url)
with open('./都市.txt','w',encoding='utf-8') as f:
q=Queue()
for i,href in enumerate(page_urls):
q.put((i,href))
ts=[]
for i in range(50):
t=MyThread(q)
t.start()
ts.append(t)
for t in ts:
t.join()
爬取的时候过滤得特别帮,没有广告