爬取北京新发地指定产品数据
本帖最后由 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)
在for i in rangge(int(page))
设置从1开始二不是从零开始
for i in rangge(1,int(page)) 本帖最后由 刘涛 于 2021-4-28 15:35 编辑
我也是刚学,我觉得最简单的办法,for i in range(int(page))改成for i in range(1,int(page)) 表示从1开始。 fanvalen 发表于 2021-4-28 15:26
在for i in rangge(int(page))
设置从1开始二不是从零开始
for i in rangge(1,int(page))
初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥 刘涛 发表于 2021-4-28 15:34
我也是刚学,我觉得最简单的办法,for i in range(int(page))改成for i in ran ...
初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥了 bluexixi 发表于 2021-4-28 15:37
初学者见笑了,看来range命令我参悟的还不透彻,谢谢大哥
然而还有个问题你的page数
你输10只有9页
也就说你还要page+1
for i in rangge(1,int(page)+1) fanvalen 发表于 2021-4-28 15:43
然而还有个问题你的page数
你输10只有9页
也就说你还要page+1
是哦,谢谢哥{:1_893:} 爬出来的文件里面的中文是乱码 luolovehk 发表于 2021-4-28 21:14
爬出来的文件里面的中文是乱码
导出来的是utf-8字符编码的CSV文件,由于中文Excel打开文件的字符编码默认不是utf-8,因此不能直接用中文Excel打开。可以在Excel中,数据选项卡--获取外部数据--自文本……,涉及到编码时选择utf-8即可
页:
[1]