各位老铁们,大家好,今天由我来为大家分享python爬交易平台数据,以及python爬取大量数据(百万级)的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
一、python可以爬取什么数据
这里的一线链接也就是我们所说的大类链接:
from bs4 import BeautifulSoupimport requests
start_url=' get_channel_urls(url):
soup= BeautifulSoup(wb_data.text,'lxml')
links= soup.select('.fenlei> dt> a')#print(links)
page_url= host_url+ link.get('href')
print(page_url)#get_channel_urls(start_url)channel_urls='''
'''123456789101112131415161718192021222324252627282930313233343536
那么拿我爬取的58同城为例就是爬取了二手市场所有品类的链接,也就是我说的大类链接;
找到这些链接的共同特征,用函数将其输出,并作为多行文本储存起来。
二、获取我们所需要的详情页面的链接和详情信息
#引入库文件from bs4 import BeautifulSoupimport requestsimport pymongo#python操作MongoDB的库import reimport time#链接和建立数据库client= pymongo.MongoClient('localhost', 27017)
ceshi= client['ceshi']#建ceshi数据库ganji_url_list= ceshi['ganji_url_list']#建立表文件ganji_url_info= ceshi['ganji_url_info']123456789101112
2、判断页面结构是否和我们想要的页面结构相匹配,比如有时候会有404页面;
3、从页面中提取我们想要的链接,也就是每个详情页面的链接;
item_link= link.get('href').split('?')[0]12
这里的这个link什么类型的,这个get方法又是什么鬼?
<class'bs4.element.Tab>1
如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class叫什么
还可以这样,利用get方法,传入属性的名称,二者是等价的
print soup.p.get('class')#['title']12
#爬取所有商品的详情页面链接:def get_type_links(channel, num):
list_view='{0}o{1}/'.format(channel, str(num))#print(list_view)
wb_data= requests.get(list_view)
soup= BeautifulSoup(wb_data.text,'lxml')
linkOn= soup.select('.pageBox')#判断是否为我们所需页面的标志;
#如果爬下来的select链接为这样:div.pageBox> ul> li:nth-child(1)> a> span这里的:nth-child(1)要删掉
link= soup.select('.zz>.zz-til> a')
link_2= soup.select('.js-item> a')
link= link+ link_2#print(len(link))
linkc= linkc.get('href')
ganji_url_list.insert_one({'url': linkc})
print(linkc) else: pass1234567891011121314151617181920
4、爬取详情页中我们所需要的信息
#爬取赶集网详情页链接:def get_url_info_ganji(url):
soup= BeautifulSoup(wb_data.text,'lxml') try:
title= soup.select('head> title')[0].text
timec= soup.select('.pr-5')[0].text.strip()
type= soup.select('.det-infor> li> span> a')[0].text
price= soup.select('.det-infor> li> i')[0].text
place= soup.select('.det-infor> li> a')[1:]
placeb= [] for placec in place:
tag= soup.select('.second-dt-bewrite> ul> li')[0].text
tag=''.join(tag.split())#print(time.split())
data={'url': url,'title': title,'time': timec.split(),'type': type,'price': price,'place': placeb,'new': tag
ganji_url_info.insert_one(data)#向数据库中插入一条数据;
print(data) except IndexError: pass123456789101112131415161718192021222324252627282930
#先从别的文件中引入函数和数据:from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom channel_extract import channel_urls#爬取所有链接的函数:def get_all_links_from(channel):
get_type_links(channel,i)#后执行这个函数用来爬取所有详情页的文件:if __name__=='__main__':# pool= Pool()## pool= Pool()# pool.map(get_url_info_ganji, [url['url'] for url in ganji_url_list.find()])# pool.close()# pool.join()#先执行下面的这个函数,用来爬取所有的链接:if __name__=='__main__':
pool.map(get_all_links_from,channel_urls.split())
pool.join()1234567891011121314151617181920212223242526
import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True:# print(ganji_url_list.find().count())
print(ganji_url_info.find().count())
二、Python爬虫数据应该怎么处理
设置变量 length()函数 char_length() replace()函数 max()函数
set@address='中国-山东省-聊城市-莘县';select@address
1.2、length()函数 char_length()函数区别
1.3、 replace()函数和length()函数组合
set@address='中国-山东省-聊城市-莘县';select@address
,replace(@address,'-','') as address_1
,length(replace(@address,'-','')) as len_add2
,length(@address)-length(replace(@address,'-','')) as _count
etl清洗字段时候有明显分割符的如何确定新的数据表增加几个分割出的字段
计算出com_industry中最多有几个-符以便确定增加几个字段最大值+1为可以拆分成的字段数此表为3因此可以拆分出4个行业字段也就是4个行业等级
select max(length(com_industry)-length(replace(com_industry,'-',''))) as _max_count
1.4、设置变量 substring_index()字符串截取函数用法
set@address='中国-山东省-聊城市-莘县';
substring_index(@address,'-',1) as china,
substring_index(substring_index(@address,'-',2),'-',-1) as province,
substring_index(substring_index(@address,'-',3),'-',-1) as city,
substring_index(@address,'-',-1) as district
case when then when then else值 end as字段名
select case when 89>101 then'大于' else'小于' end as betl1_socom_data
字段索引没有提索引算法建议用BTREE算法增强查询效率
2.1.kettle文件名:trans_etl1_socom_data
2.2.包括控件:表输入>>>表输出
2.3.数据流方向:s_socom_data>>>>etl1_socom_data
2.4、表输入2.4、SQL脚本初步清洗com_district和com_industry字段
select a.*,case when com_district like'%业' or com_district like'%织' or com_district like'%育' then null else com_district end as com_district1
,case when com_district like'%业' or com_district like'%织' or com_district like'%育' then concat(com_district,'-',com_industry) else com_industry end as com_industry_total
,replace(com_addr,'地址:','') as com_addr1
,replace(com_phone,'电话:','') as com_phone1
,replace(com_fax,'传真:','') as com_fax1
,replace(com_mobile,'手机:','') as com_mobile1
,replace(com_url,'网址:','') as com_url1
,replace(com_email,'邮箱:','') as com_email1
,replace(com_contactor,'联系人:','') as com_contactor1
,replace(com_emploies_nums,'公司人数:','') as com_emploies_nums1
,replace(com_reg_capital,'注册资金:万','') as com_reg_capital1
,replace(com_type,'经济类型:','') as com_type1
,replace(com_product,'公司产品:','') as com_product1
,replace(com_desc,'公司简介:','') as com_desc1from s_socom_data as a
①涉及爬虫增量操作不要勾选裁剪表选项
②数据连接问题选择表输出中表所在的数据库
③字段映射问题确保数据流中的字段和物理表的字段数量一致对应一致
首先建表增加了4个字段演示步骤在视频里
字段索引没有提索引算法建议用BTREE算法增强查询效率
主要针对etl1生成的新的com_industry进行字段拆分清洗
3.1.kettle文件名:trans_etl2_socom_data
3.2.包括控件:表输入>>>表输出
3.3.数据流方向:etl1_socom_data>>>>etl2_socom_data
①涉及爬虫增量操作不要勾选裁剪表选项
②数据连接问题选择表输出中表所在的数据库
③字段映射问题确保数据流中的字段和物理表的字段数量一致对应一致
3.4、SQL脚本对com_industry进行拆分完成所有字段清洗注册资金字段时间关系没有进行细致拆解调整代码即可
#行业为''的值置为空when length(com_industry)=0 then null
#其他的取第一个-分隔符之前else substring_index(com_industry,'-',1) end as com_industry1,case
when length(com_industry)-length(replace(com_industry,'-',''))=0 then null
#'交通运输、仓储和邮政业-'这种值行业2也置为nullwhen length(com_industry)-length(replace(com_industry,'-',''))=1 and length(substring_index(com_industry,'-',-1))=0 then nullwhen length(com_industry)-length(replace(com_industry,'-',''))=1 then substring_index(com_industry,'-',-1)else substring_index(substring_index(com_industry,'-',2),'-',-1)end as com_industry2,case
when length(com_industry)-length(replace(com_industry,'-',''))<=1 then nullwhen length(com_industry)-length(replace(com_industry,'-',''))=2 then substring_index(com_industry,'-',-1)else substring_index(substring_index(com_industry,'-',3),'-',-1)end as com_industry3,case
when length(com_industry)-length(replace(com_industry,'-',''))<=2 then nullelse substring_index(com_industry,'-',-1)end as com_industry4from etl1_socom_data as a
4.1爬虫数据源数据和网站数据是否相符
如果本身工作是爬虫和数据处理在一起处理,抓取的时候其实已经判断,此步骤可以省略,如果对接上游爬虫同事,这一步首先判断,不然清洗也是无用功,一般都要求爬虫同事存储请求的url便于后面数据处理查看数据质量
4.2计算爬虫数据源和各etl清洗数据表数据量
注:SQL脚本中没有经过聚合过滤 3个表数据量应相等
4.2.1、sql查询下面表我是在同一数据库中如果不在同一数据库 from后面应加上表所在的数据库名称
select count(1) from s_socom_dataunion all
select count(1) from etl1_socom_dataunion all
select count(1) from etl2_socom_data
4.2.2根据 kettle转换执行完毕以后表输出总量对比
确保前两个步骤已经无误,数据处理负责的etl清洗工作自查开始针对数据源清洗的字段写脚本检查 socom网站主要是对地区和行业进行了清洗对其他字段做了替换多余字段处理,因此采取脚本检查,
找到page_url和网站数据进行核查
where里面这样写便于查看某个字段的清洗情况
where com_district is null and length(com_industry)-length(replace(com_industry,'-',''))=3
此页面数据和etl2_socom_data表最终清洗数据对比
三、python爬取大量数据(百万级)
1、当用python爬取大量网页获取想要的数据时,最重要的问题是爬虫中断问题,python这种脚本语言,一中断
2、进程就会退出,怎么在中断后继续上次爬取的任务就至关重要了。这里就重点剖析这个中断问题。
3、第一个问题:简单点的用动态代理池就能解决,在爬取大量数据的时候,为了速度不受影响,建议使用一些缓
4、存的中间件将有效的代理 ip缓存起来,并定时更新。这里推荐 github这个仓库
5、 ,它会做ip有效性验证并将 ip放入 redis,不过实现过于复杂
6、了,还用到了 db,个人觉得最好自己修改一下。困难点的就是它会使用别的请求来进行判断当前的ip是否
7、是爬虫,当我们过于聚焦我们的爬虫请求而忽略了其他的请求时,可能就会被服务器判定为爬虫,进而这个ip
8、会被列入黑名单,而且你换了ip一样也会卡死在这里。这种方式呢,简单点就用 selenium+ chrome一个一个
9、去爬,不过速度太慢了。还是自己去分析吧,也不会过复杂的。
10、第二个问题:网络连接超时是大概率会遇到的问题,有可能是在爬取的时候本地网络波动,也有可能是爬
11、取的服务端对ip做了限制,在爬取到了一定量级的时候做一些延迟的操作,使得一些通用的 http库超时
12、( urllib)。不过如果是服务端动的手脚一般延迟不会太高,我们只需要人为的设置一个高一点的
13、 timeout即可(30秒),最好在爬取开始的时候就对我们要用的爬取库进行一层封装,通用起来才好改
14、第三个问题:在解析大量静态页面的时候,有些静态页面的解析规则不一样,所以我们就必须得做好断点
15、续爬的准备了( PS:如果简单的忽略错误可能会导致大量数据的丢失,这就不明智了)。那么在调试的过
16、程中断点续爬有个解决方案,就是生产者和消费者分离,生产者就是产生待爬 url的爬虫,消费者就是爬取
17、最终数据的爬虫。最终解析数据就是消费者爬虫了。他们通过消息中间件连接,生产者往消息中间件发送待
18、爬取的目标信息,消费者从里面取就行了,还间接的实现了个分布式爬取功能。由于现在的消费中间件都有
19、 ack机制,一个消费者爬取链接失败会导致消息消费失败,进而分配给其他消费者消费。所以消息丢失的
20、概率极低。不过这里还有个 tips,消费者的消费超时时间不能太长,会导致消息释放不及时。还有要开启
21、消息中间价的数据持久化功能,不然消息产生过多而消费不及时会撑爆机器内存。那样就得不偿失了。
22、第四个问题:这种情况只能 try except catch住了,不好解决,如果单独分析的话会耗费点时间。但在
23、大部分数据(99%)都正常的情况下就这条不正常抛弃就行了。主要有了第三个问题的解决方案再出现这
好了,关于python爬交易平台数据和python爬取大量数据(百万级)的问题到这里结束啦,希望可以解决您的问题哈!
声明:本文内容来自互联网不代表本站观点,转载请注明出处:https://www.41639.com/15_310334.html
