python多线程抓取数据失败?(21L补充新代码)
本帖最后由 double07 于 2021-10-22 23:53 编辑需要抓取的数据十多万条,单线程肯定不行,所以多线程是最佳答案,但通过实验,多线程代码并未起作用,与单线程时间差不多,问题出在哪儿?
def single_thread():
link_lst = ['https://cq.ke.com/ershoufang/chaotianmen/', 'https://cq.ke.com/ershoufang/lianglukou/']
for ls in link_lst:
download(ls)
def multi_thread():
threads=[]
link_lst = ['https://cq.ke.com/ershoufang/chaotianmen/', 'https://cq.ke.com/ershoufang/lianglukou/']
for ls in link_lst:
threads.append(
threading.Thread(target=download,args=(ls,))
)
for thread in threads:
thread.start()
for thread in threads:
thread.join()
def download(ls):
global p
price = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7']
for pr in price:
url = ls + pr + '/'
try:
html = gethtml(url)
mount = re.findall(r'共找到<span> (.*?) </span>套', html).strip()
page = eval(mount) // 30 + 1
p_lst = ls + "pg{}" + pr + "/"
url_list =
for i in url_list:
html_detail = gethtml(i)
html = etree.HTML(html_detail)
b = html.xpath('//li[@class="clear"]')
for i in range(len(b)):
lst['主城九区'] = re.findall(r'<a class="selected CLICKDATA" .*?\s+.*?>(.*?)</a>', html_detail)
lst['小区名称'] = b.xpath('./div/div/div/div/a/text()')
lst['商圈'] = re.findall(r'.*?共找到.*?<a.*?>(.*?)二手房</a>', html_detail)
data_list.append(lst)
p = p + 1
print('第%s条数据已保存' % p)
except Exception:
coutinue
if __name__ == '__main__':
start=time.time()
multi_thread()
end=time.time()
print('single_thread cost:',end-start,'s') download这个方法怎么写的 菱角 发表于 2021-10-21 18:31
download这个方法怎么写的
已补~~~~~~ 全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 datalist是个list吗?实际上append的速度比较慢。并且如果数据多的话,结果都存在datalist里,会导致内存消耗大。 阳光肥肥 发表于 2021-10-21 20:45
全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 data ...
你这个不太对吧,多线程,如果不是需要写入文件I/O,其实可以不需要加锁的吧,楼主的代码里也没有要写入文件 Sandwiches 发表于 2021-10-21 21:03
你这个不太对吧,多线程,如果不是需要写入文件I/O,其实可以不需要加锁的吧,楼主的代码里也没有要写入 ...
这是测试代码,最后数据还是要导出excel 阳光肥肥 发表于 2021-10-21 20:45
全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 data ...
p与datalist都是全局变量,datalist是list,没放出来。怎么感觉这个多线程根本就没运行起来,还是顺序在执行 double07 发表于 2021-10-21 21:08
p与datalist都是全局变量,datalist是list,没放出来。怎么感觉这个多线程根本就没运行起来,还是顺序在执 ...
我也感觉没运行多线程 本帖最后由 Sandwiches 于 2021-10-21 21:21 编辑
假设dowload函数方法没有错的情况,修改函数方法def multi_thread():修改成下面这样看看行不行
def multi_thread():
threads=[]
link_lst = ['https://cq.ke.com/ershoufang/chaotianmen/', 'https://cq.ke.com/ershoufang/lianglukou/']
for ls in link_lst:
thread= threading.Thread(target=download,args=(ls,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join() 本帖最后由 double07 于 2021-10-21 21:27 编辑
Sandwiches 发表于 2021-10-21 21:18
假设dowload函数方法没有错的情况,修改函数方法def multi_thread():修改成下面这样看看行不行
def multi ...
还是顺序的,不行,太慢了