爬取中国木业企业大全

26 篇文章 0 订阅
17 篇文章 0 订阅

这个里我导入的包

from urllib import request
from lxml import etree
import random,re,chardet
from multiprocessing import Pool
import pandas as pd


首先我们需要看爬取的网页是以什么样的请求

http://www.wood168.net

这里我写一个网页请求函数,方便以后调用同样实现了低耦合

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">(.*?)&nbsp;(.*?)</div>', html)  # name
        
        #这里是因为名字那有很多符号,使用我们进行清洗一下在填入数据
        n = name[0][1]
        n.strip()
        if '(&nbsp;)' in n:
            n = n.replace('(&nbsp;)', '')
        elif '&nbsp;' in n:
            n = n.replace('&nbsp;', '-')
        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("<<<<爬取成功!>>>>")

注意事项编码器



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Black_God1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值