Python3 多线程数据采集中的一些坑

采集数据的准备:

1.网页解析:Requests 这个是Python中的Python HTTP 神库

2.threading,queue,re,time 等系统模块

并没有使用采集框架,除Requests模块以外,其它完全使用标准库模块。

伪代码

workQueue = queue.Queue() #采集任务
threads[] 采集线程。
class Mythread: #创建工作线程
p_title = r'\d+\w+\d\d\d' #一些需要采集的正则

def doThreading() #线程中需要执行的任务
......
for i in work:
    workQueue.put(item)#组装任务
#创建工作线程
for name in threadName:
    thread = thread.Thread(name)
    thread.start()#开始采集
    threads.append(thread) #入队列

# 一直循环判断任务是否结束
while not workQueue.empty():
        time.sleep(1)
#释放进程
for t in threads:
    t.join()

保存文件或是加入数据库

遇到的一些坑(问题):

1.采集中遇到连接超时 长时间采集,网络连接超时会报out异常,线程自然就会结束,程序崩溃。 这个采用try捕获后,把当前失败的任务重新workQueue.put(item)#再次装回任务队列中

2.正则匹配不到,组装结果时报 None 异常 这个建议用if判断一下,如果没有匹配到结果后进行一下处理比较好,不然任务多起来,网页上各种情况都有可能的。

3.数据保存 一般保存没有什么大问题,主要是读取。 如果保存后是字符串,之前是list 或是 元组(Tuples)保存后就是字符串了,再读取就需要转换成对应的容器,这里用eval(s)函数方法,效果还是比较不错的。 还有就是大文本在读取的时候如果一次用python read()全部读取的时候会出现莫明的无反应及读取内容不全的情况 ,这里采用分段读取比较好些:

l = []
with open('test.txt', mode='r',encoding='utf-8') as f:
    s = ''
    while True:  
        temp = f.read(100)#分段读取,可以解决读取大文件时无法读取的奇怪问题
        if temp == '':  
            break
        s += temp
    l = eval(s)
    print(len(l))
    f.close() 

当然也可以直接入库,sqlite3当然是最佳的选择。

conn = sqlite3.connect('designlist.db')#创建数据库
cur = conn.cursor()#游标

#插入数据
for k in l:
    v = (None,k[0],k[1],k[2],int(k[3]))
    ins = "insert into tb values(?,?,?,?,?);"
    cur.execute(ins, v)
conn.commit()#提交事务
conn.close#关闭连接

据说,这种方式插入数据可以防止SQL注入?

还就是多线程分配任务

多线程存在从wordQueue中抢任务的现象,有时只会有一二个线程在工作,其它线程都傻住不动,这里解决的方法就是在每个线程工作结束后让他休息sleep(0.001)秒,这样其它线程就有机会抢到工作了。

本贴主要是记录在多线程采集中遇到的坑,有问题可以和我一起探讨哈。

转载于:https://my.oschina.net/jsky/blog/1329868

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值