吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2396|回复: 8
收起左侧

[Python 转载] 爬取北京新发地指定产品数据

[复制链接]
bluexixi 发表于 2021-4-28 14:52
本帖最后由 bluexixi 于 2021-4-28 15:10 编辑

Python学习中,这个程序主要练习一下多线程爬取。
看B站大佬的教程有个北京新发地的教程,但是他是爬取所有产品,我根据大佬的教程优化了一下。
可以设置要爬取的产品。比如:樱桃。
设置要爬取的页码数量。
设置线程池数量。

不过现在有个问题,爬取的时候页面设置存在0页,0页的数据和第1页数据相同,导致下载的数据有重复的,但是程序可以执行,没有影响。
请问各位大佬,这个问题怎么解决。

----------------------------------------------------
单线程效果:

单线程

单线程


----------------------------------------------------
多线程效果:

多线程

多线程


----------------------------------------------------
重复页码问题请大佬帮忙解决:
c.png


d.png


[Python] 纯文本查看 复制代码
# coding:utf-8

import requests
import csv
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
import time


def bjxfd(url):
    headers = {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
        'Referer': 'http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml'
    }

    f = open(x + '.csv', 'a+', encoding='utf-8')
    data_csv = csv.writer(f)
    x_res = requests.get(url=url, headers=headers)
    html = etree.HTML(x_res.text)
    table = html.xpath("/html/body/div[2]/div[4]/div[1]/table")[0]
    trs = table.xpath("./tr[position()>1]")  # 去掉标题栏,只爬取数据
    # print('<---品名----最低价----平均价----最高价----规格----单位-----发布日期--->')
    for tr in trs:
        txt = tr.xpath("./td/text()")
        txt = (item.replace('\\', '').replace('/', '')
               for item in txt)  # 对/\\进行处理
        # print(list(txt))
        data_csv.writerow(txt)
    print(url, '您要的【' + x + '】价格提取完毕!')


if __name__ == '__main__':
    x = input('请输入要查看的产品价格(如:西瓜):')
    page = input('请输入要查看产品的页码数量:')
    Tpe = input('请输入要开启的线程池数量:')
    start = time.time()  # 测试用时多久
    print('当前时间:', start)
    f = open(x + '.csv', 'w', encoding='utf-8')  # 反复查询一个产品时,每次执行程序清空文档。
    f.close()
    url = f'http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml?prodname={x}'
    with ThreadPoolExecutor(int(Tpe)) as t:    # 开启20条线程
        for i in range(int(page)):
            t.submit(bjxfd, f'http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml?prodname={x}')
    time = time.time() - start  # 测试用时多久
    print('用时:', time)

源码.rar

1.12 KB, 下载次数: 17, 下载积分: 吾爱币 -1 CB

源码

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

fanvalen 发表于 2021-4-28 15:26
在for i in rangge(int(page))
设置从1开始二不是从零开始
for i in rangge(1,int(page))
刘涛 发表于 2021-4-28 15:34
本帖最后由 刘涛 于 2021-4-28 15:35 编辑

我也是刚学,我觉得最简单的办法,
[Python] 纯文本查看 复制代码
for i in range(int(page))改成  for i in range(1,int(page)) 表示从1开始。
 楼主| bluexixi 发表于 2021-4-28 15:37
fanvalen 发表于 2021-4-28 15:26
在for i in rangge(int(page))
设置从1开始二不是从零开始
for i in rangge(1,int(page))

初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥
 楼主| bluexixi 发表于 2021-4-28 15:38
刘涛 发表于 2021-4-28 15:34
我也是刚学,我觉得最简单的办法,[mw_shl_code=python,true]for i in range(int(page))改成  for i in ran ...

初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥了
fanvalen 发表于 2021-4-28 15:43
bluexixi 发表于 2021-4-28 15:37
初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥

然而还有个问题你的page数
你输10只有9页
也就说你还要page+1
for i in rangge(1,int(page)+1)
 楼主| bluexixi 发表于 2021-4-28 15:46
fanvalen 发表于 2021-4-28 15:43
然而还有个问题你的page数
你输10只有9页
也就说你还要page+1

是哦,谢谢哥
luolovehk 发表于 2021-4-28 21:14
爬出来的文件里面的中文是乱码
叫我小王叔叔 发表于 2021-4-29 09:07
luolovehk 发表于 2021-4-28 21:14
爬出来的文件里面的中文是乱码

导出来的是utf-8字符编码的CSV文件,由于中文Excel打开文件的字符编码默认不是utf-8,因此不能直接用中文Excel打开。可以在Excel中,数据选项卡--获取外部数据--自文本……,涉及到编码时选择utf-8即可
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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