|
10鱼币
我想用xpath多线程来爬取top250的所有电影名,为啥储存的csv文件里面的电影不是按照网页里面的来排名 - import requests
- from lxml import etree
- import csv
- from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
- f = open("data.csv",'w',encoding='utf-8',newline='')
- csvwriter = csv.writer(f)
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'
- }
- def download_one_page(url):
- resp = requests.get(url,headers=headers)
- html = etree.HTML(resp.text)
- table = html.xpath('//*[@id="content"]/div/div[1]')[0]
- movies = table.xpath("./ol/li")
- for movie in movies:
- movies_name = movie.xpath("./div/div[2]/div[1]/a/span[1]/text()")
- #把数据存放在文件中
- csvwriter.writerow(movies_name)
- if __name__ == '__main__':
- with ThreadPoolExecutor(50) as t:
- for i in range(0,10):
- t.submit(download_one_page,f"https://movie.douban.com/top250?start={i}&filter=")
复制代码
前面应该都没问题 就最后一部分的循环出问题了吗 求给萌新解答一下
首先,我不了解 Python 进行多线程操作相关的细节,下面的回答仅供您酌情参考。
我没有理解您的多线程实现的细节。似乎 top250 的 URL 中 start 参数的含义是从第 start 个电影开始的结果,从您循环的范围我怀疑可能本身访问的范围就有重复?
关于顺序问题,通常而言多个线程之间的执行顺序是没有保证的,也就是说完全可能出现后启动的线程首先执行,因而排名更靠后的项目首先被写入文件的情况。在保存时同时保存其排名以待全部数据获取完毕后进行排序是解决此问题的一个朴素办法。
|
最佳答案
查看完整内容
首先,我不了解 Python 进行多线程操作相关的细节,下面的回答仅供您酌情参考。
我没有理解您的多线程实现的细节。似乎 top250 的 URL 中 start 参数的含义是从第 start 个电影开始的结果,从您循环的范围我怀疑可能本身访问的范围就有重复?
关于顺序问题,通常而言多个线程之间的执行顺序是没有保证的,也就是说完全可能出现后启动的线程首先执行,因而排名更靠后的项目首先被写入文件的情况。在保存时同时保存其排名以待全部 ...
|