python多线程爬取小说顺序保存

今天逛微信朋友圈弹出了一个小说广告,点进去,唉,还好看耶,只看了前面两章就要下载app看,于是转战百度看,这百度上面的盗版小说网十分没素质

python多线程爬取小说顺序保存_第1张图片

全是广告也算了,点击下一页跳转到其他网站的广告,必须返回目录才能看下一章

简单看了下目录,所有的章节和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()


爬取的时候过滤得特别帮,没有广告

python多线程爬取小说顺序保存_第2张图片

python多线程爬取小说顺序保存_第3张图片

python多线程爬取小说顺序保存_第4张图片

 

你可能感兴趣的:(python)