17856563101 发表于 2022-9-8 15:58:09

关于xpath多线程的一个问题

我想用xpath多线程来爬取top250的所有电影名,为啥储存的csv文件里面的电影不是按照网页里面的来排名{:10_266:} 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')
    movies = table.xpath("./ol/li")
    for movie in movies:
      movies_name = movie.xpath("./div/div/div/a/span/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=")

前面应该都没问题 就最后一部分的循环出问题了吗 求给萌新解答一下 {:10_281:}

dolly_yos2 发表于 2022-9-8 15:58:10

首先,我不了解 Python 进行多线程操作相关的细节,下面的回答仅供您酌情参考。
我没有理解您的多线程实现的细节。似乎 top250 的 URL 中 start 参数的含义是从第 start 个电影开始的结果,从您循环的范围我怀疑可能本身访问的范围就有重复?
关于顺序问题,通常而言多个线程之间的执行顺序是没有保证的,也就是说完全可能出现后启动的线程首先执行,因而排名更靠后的项目首先被写入文件的情况。在保存时同时保存其排名以待全部数据获取完毕后进行排序是解决此问题的一个朴素办法。

17856563101 发表于 2022-9-8 16:01:56

最后得到的数据有重复的,然后也不是按照网页里面的排名来排序的

17856563101 发表于 2022-9-8 16:11:57

dolly_yos2 发表于 2022-9-8 16:08
首先,我不了解 Python 进行多线程操作相关的细节,下面的回答仅供您酌情参考。
我没有理解您的多线程实现 ...

我好像明白了 那个start参数好像不能这么用{:10_266:}
页: [1]
查看完整版本: 关于xpath多线程的一个问题