bluexixi 发表于 2021-4-28 14:52

爬取北京新发地指定产品数据

本帖最后由 bluexixi 于 2021-4-28 15:10 编辑

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

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

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


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


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






# 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/div/div/table")
    trs = table.xpath("./tr")# 去掉标题栏,只爬取数据
    # 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)

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 编辑

我也是刚学,我觉得最简单的办法,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
我也是刚学,我觉得最简单的办法,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


是哦,谢谢哥{:1_893:}

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即可
页: [1]
查看完整版本: 爬取北京新发地指定产品数据