本帖最后由 bluexixi 于 2021-4-28 15:10 编辑
Python学习中,这个程序主要练习一下多线程爬取。
看B站大佬的教程有个北京新发地的教程,但是他是爬取所有产品,我根据大佬的教程优化了一下。
可以设置要爬取的产品。比如:樱桃。
设置要爬取的页码数量。
设置线程池数量。
不过现在有个问题,爬取的时候页面设置存在0页,0页的数据和第1页数据相同,导致下载的数据有重复的,但是程序可以执行,没有影响。
请问各位大佬,这个问题怎么解决。
----------------------------------------------------
单线程效果:
单线程
----------------------------------------------------
多线程效果:
多线程
----------------------------------------------------
重复页码问题请大佬帮忙解决:
[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)
|