线程版的 多线程小爬虫 适合新手

Posted guducp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程版的 多线程小爬虫 适合新手相关的知识,希望对你有一定的参考价值。

mport threading, requests, time, re, os

"""
写个思路,把普通爬虫直接拉进来,但是全局变量不太清楚会造成什么样的影响
之前使用全局变量列表应该要分成两个,函数内部同名变量也互相不影响

但有个很大的问题,代码比较臃肿。无法将一个函数给两个线程同时使用
因为业务逻辑已经固定了,驾驶函数1和函数2同时从第一页开始爬取到的数据是没有差别的

所以我将一共五百页的东西分成1-250+和250+到500+两个循环
分别用函数1和函数2来执行

应该可以调用一个函数了,只需要定义两个列表,然后作为参数分别在调用函数的时候传入
get_pic_list()之内

"""
package_list = []
package_list2 = []
# 1.每页的url从1-531,使用for循环 拼接url
# 2.打开url之后,使用正则findall抓取该页的具体包链接 ,存入package_list


def get_pic_url(page,list):
try:
os.mkdir(str(page))
except Exception as e:
pass
head = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/61.0.3163.91 Safari/537.36‘}
url = ‘http://www.doutula.com/article/list/?page={}‘.format(page)
res = requests.get(url,headers = head)
tmp = re.findall(r‘<a href="([^#].*?)" class=".*?">‘, res.text)
print(tmp)
list.extend(tmp)
# 3.使用for循环遍历package_list 作为picture_url
# 4.打开改url ,然后抓取url中的表情jpg,存入本地文件夹或者数据库
for pic_url in list:
if len(pic_url) != len(‘http://www.doutula.com/article/detail/1070805‘):
break
else:
res_pic = requests.get(pic_url,headers = head)
reg = r‘‘‘<img src="(.*?)" alt="(.*?)" .*?>‘‘‘
reg = re.compile(reg,re.S)
tmp = re.findall(reg,res_pic.text)

print(tmp)

for i in tmp:
num = tmp.index(i)
picture_res = requests.get(i[0],headers = head)
string = ‘‘
if picture_res:
tmp_str = i[1]
for each in tmp_str:
if each in (‘\\‘,‘/‘,‘*‘,‘?‘,‘"‘,‘|‘,‘>‘,‘<‘):
pass
else:
string = string + each
tmp_str = string
if tmp_str[-3:] == ‘jpg‘:
with open(r‘./{}/{}-{}{}.jpg‘.format(page,list.index(pic_url),num,tmp_str),‘wb‘) as f:
f.write(picture_res.content)
time.sleep(1)
else:
with open(r‘./{}/{}-{}{}.gif‘.format(page,list.index(pic_url),num,tmp_str),‘wb‘) as f:
f.write(picture_res.content)
time.sleep(1)
else:
break
list.clear()


def fun1():
for page in range(1,265): # 一共532
get_pic_url(page,package_list)


def fun2():
for page in range(265,532): # 一共532
get_pic_url(page,package_list2)

if __name__ == "__main__":

t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)

t1.start()
t2.start()

# 成功实现

以上是关于线程版的 多线程小爬虫 适合新手的主要内容,如果未能解决你的问题,请参考以下文章

有没有易懂的 Python 多线程爬虫代码

C#爬虫爬虫的多线程如何实现

unity3d网络通信用多线程会比协程好吗

爬虫.多线程爬虫与多进程爬虫

Python爬虫编程思想(135):多线程和多进程爬虫--Python与线程

Python爬虫编程思想(135):多线程和多进程爬虫--Python与线程