double07 发表于 2021-10-21 18:10

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')

菱角 发表于 2021-10-21 18:31

download这个方法怎么写的

double07 发表于 2021-10-21 19:09

菱角 发表于 2021-10-21 18:31
download这个方法怎么写的

已补~~~~~~

阳光肥肥 发表于 2021-10-21 20:45

全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 datalist是个list吗?实际上append的速度比较慢。并且如果数据多的话,结果都存在datalist里,会导致内存消耗大。

Sandwiches 发表于 2021-10-21 21:03

阳光肥肥 发表于 2021-10-21 20:45
全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 data ...

你这个不太对吧,多线程,如果不是需要写入文件I/O,其实可以不需要加锁的吧,楼主的代码里也没有要写入文件

double07 发表于 2021-10-21 21:05

Sandwiches 发表于 2021-10-21 21:03
你这个不太对吧,多线程,如果不是需要写入文件I/O,其实可以不需要加锁的吧,楼主的代码里也没有要写入 ...

这是测试代码,最后数据还是要导出excel

double07 发表于 2021-10-21 21:08

阳光肥肥 发表于 2021-10-21 20:45
全局变量p和datalist?
第一 多个线程修改同一个变量的时候应该加锁 否则可能出现预料外的结果
第二 data ...
p与datalist都是全局变量,datalist是list,没放出来。怎么感觉这个多线程根本就没运行起来,还是顺序在执行

Sandwiches 发表于 2021-10-21 21:15

double07 发表于 2021-10-21 21:08
p与datalist都是全局变量,datalist是list,没放出来。怎么感觉这个多线程根本就没运行起来,还是顺序在执 ...

我也感觉没运行多线程

Sandwiches 发表于 2021-10-21 21:18

本帖最后由 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:25

本帖最后由 double07 于 2021-10-21 21:27 编辑

Sandwiches 发表于 2021-10-21 21:18
假设dowload函数方法没有错的情况,修改函数方法def multi_thread():修改成下面这样看看行不行
def multi ...
还是顺序的,不行,太慢了
页: [1] 2 3
查看完整版本: python多线程抓取数据失败?(21L补充新代码)