鱼C论坛

 找回密码
 立即注册
查看: 2120|回复: 3

[已解决]关于xpath多线程的一个问题

[复制链接]
发表于 2022-9-8 15:58:09 | 显示全部楼层 |阅读模式
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=")

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

最佳答案

查看完整内容

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

使用道具 举报

发表于 2022-9-8 15:58:10 | 显示全部楼层    本楼为最佳答案   
首先,我不了解 Python 进行多线程操作相关的细节,下面的回答仅供您酌情参考。
我没有理解您的多线程实现的细节。似乎 top250 的 URL 中 start 参数的含义是从第 start 个电影开始的结果,从您循环的范围我怀疑可能本身访问的范围就有重复?
关于顺序问题,通常而言多个线程之间的执行顺序是没有保证的,也就是说完全可能出现后启动的线程首先执行,因而排名更靠后的项目首先被写入文件的情况。在保存时同时保存其排名以待全部数据获取完毕后进行排序是解决此问题的一个朴素办法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-8 16:01:56 | 显示全部楼层
最后得到的数据有重复的,然后也不是按照网页里面的排名来排序的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我好像明白了 那个start参数好像不能这么用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表