这个里我导入的包
from urllib import request
from lxml import etree
import random,re,chardet
from multiprocessing import Pool
import pandas as pd
首先我们需要看爬取的网页是以什么样的请求
这里我写一个网页请求函数,方便以后调用同样实现了低耦合
def pq(url):#爬取请求
# 添加报头
headers = {'User-Agent': pa()} #这里的pa函数是我自己的网页报头,使用自己的也可以
res = request.Request(url, headers=headers)
# 开启接口爬取
html = request.urlopen(res)
ht = html.read()
data = chardet.detect(ht)
# 进行转码
req = ht.decode(data['encoding'], 'ignore')
return req
我们跳转到第二页看看网页链接是怎么写的
http://www.wood168.net/area/sh.asp?whichpage=3&area=�Ϻ�&max=6994&maxcount=466
我们得到了一个get请求分析一下链接发现whichpage=3是页数max=6994是全部有多少数据maxcount=466是多少页
这里我们可以写个循环解决
def a(): #获取所以url地址
# URL
nr=[]
x=['http://www.wood168.net/area/sh.asp','http://www.wood168.net/area/jiangshu.asp','http://www.wood168.net/area/zj.asp','http://www.wood168.net/area/guangdong.asp','http://www.wood168.net/area/guangxi.asp','http://www.wood168.net/area/yunnan.asp']
#这里是因为我要固定的地方全部公司所以列表循环
for i in x:
url=i
data=pq(url)
html = etree.HTML(data)
shu=html.xpath('//div[@align="center"]//font[2]//text()')
xx=[]
for j in range(1,int(shu[0])+1):
url_r=i+'?whichpage={}&maxcount={}'.format(str(j),str(shu[0]))
xx.append(url_r)
nr+=xx
# print(len(xx))
# print(nr)
print('爬取了',len(xx),'数量')
return nr
如何获取网页内容
这是网页内容
我们看一下每个a标签的链接
http://www.wood168.net/com/103737.html
http://www.wood168.net/com/103735.html
首先我们要获取每个网页的a标签地址
def b(url):#获取所以url地址内容页的url
print('爬取第二阶段>>>')
xx=[]
nr_ye='http://www.wood168.net/cmpcard.asp?this='
data=pq(url=url)
name = re.findall('<font size=3><a href="../com/(.*?).html" target="_blank">', data)
for i in name:
xx.append(nr_ye+str(i))
print('爬取第二阶段结束《《《《《《')
nrye(url=xx)
爬取内容信息页面
页面效果如下
可以使用正则进行匹配爬取
def nrye(url):#内容页爬取信息
print('开始爬取内容信息>>>')
for i in url:
html=pq(url=i)
mc = re.findall(r'<div align="center"><a href="#"><font size=3 color=#0000ff><b>(.*?)</b></font></a></div>',html) # 名称
name = re.findall(r'<div align="center">(.*?) (.*?)</div>', html) # name
#这里是因为名字那有很多符号,使用我们进行清洗一下在填入数据
n = name[0][1]
n.strip()
if '( )' in n:
n = n.replace('( )', '')
elif ' ' in n:
n = n.replace(' ', '-')
else:
pass
name_1=name[0][0].strip()
name_2=n
diz=re.findall(r'<td>地 址:(.*?)</td>', html) # 地址
yb=re.findall(r'<td>邮 编:(.*?) </td>', html) # 邮编
dianh=re.findall(r'td>电 话:(.*?)</td>', html) # 电话
chuanz=re.findall(r'<td>传 真:(.*?)</td>', html) # 传真
shoj=re.findall(r'<td>手 机:(.*?)</td>', html) # 手机
yj=re.findall(r'<td>电子邮件:(.*?)</td>', html) # 电子邮件
wangz=re.findall(r'<td>公司网址:<a href="(.*?)"><font color=blue>', html) # 网站
cun([mc,[name_1],[name_2],diz,yb,dianh,chuanz,shoj,yj,wangz])
存储函数
def cun(data): # 存储
print('开始存储!!!!')
data_t = pd.DataFrame(data)
data_t=data_t.T
data_t.to_csv(r'爬取资料\data.csv',header=None,index=None,mode='a',encoding="utf_8")
这里地址自己填入自己的地址哦!!!
开启进程池
if __name__ == '__main__':
nr=a() # 第一个
nr=list(set(nr))
pool=Pool(12) #开启12个进程池
for i in nr:
pool.apply_async(b,args=(i,))
pool.close()
pool.join()
print("<<<<爬取成功!>>>>")