一、掌握python爬虫对数据处理有用吗?
有时候在想,数据处理能应用到python爬虫吗,似乎两者没什么关联,最近工作中我却发现对接爬虫同事时候,掌握爬虫还是很必要的。
首先你懂得了爬虫逻辑,在他们抓取数据时候可以从自己的工作内容简单高效处理提出自己的需求,自己想要什么字段,从之前他们爬取过的站里找到字段page_url,进去看下网站的结构,看下他们爬取的逻辑。上周我整理了之前抓取的数据,发现一个现象爬取新数据源时候表字段、表名没有完全一致,名称的有的是com_name,有的是company_name,地址有的是area,有的是address,这样给我的感觉是数据是乱的,毕竟不是一个表,而是几十张表,因此整理出表字段和表命名规则,这样在后期数据整合多个数据源的时候写脚本可以不用担心找不到字段,尤其是纵向合并数据表插入的时候多个数据源字段名要保持一致,如果字段不一致无疑会增加工作量和错误率,有这样一个标准就好太多。
再次懂了爬虫,对数据存储自己心里已经大致有数了,规整的数据第一步就需要从数据源抓取开始,比如有的数据源上面有省市字段,存入的时候却只存入了市字段,有的有城市名一时疏忽只取了城市url的拼音sh(url为:sh.58.com),sh上来你是不知道含义的,有的表只有city_id字段省市度没有,这样在后期处理的时候就带来不少麻烦,每个数据源我需要去重新观察页面,还要考虑数据量的问题,几百万的数据量删掉重新跑显然不现实,这时候就需要在数据里找到爬取存库的逻辑,把sh对应的城市字段找到。
二、python爬虫对数据处理的应用
1、58案例
从结果方向思考,最后我想要的数据肯定是包含省市字段的,现在只有市的拼音字段,数据源是58,那么我首先想到的就是去58,将拼音和市这两个字段进行唯一映射,存成一个表a,然后将爬取到的数据b和a通过拼音关联,找到市以后,再和我原来爬取建好的省市表c通过市字段关联,这样就可以解决,下面就是针对我数据库城市拼音简称的爬虫应用
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import MySQLdb
from lxml import etree
import MySQLdb
url='http://www.58.com/changecity.aspx?PGTID=0d202408-0000-1814-1956-f636ed802e20&ClickID=1'
html=requests.get(url).content
selector=etree.HTML(html)
province_data0=selector.xpath('//dd//a/text()')
province_data1=selector.xpath('//dd//a/@href')
data=zip(province_data0,province_data1)
n=1
for i in data:
city_name=i[0]
area=i[1].replace('http:','').strip()
area = area.strip('//')
if '-' in area:
area=area.split('-')[1].replace('/','')
else:
area=area.split('.')[0]
conn=MySQLdb.connect(host='localhost',user='root',passwd='密码',db='local_db',port=3306,charset='utf8')
with conn:
cursor=conn.cursor()
print n,city_name, area,i[1]
cursor.execute('insert into 58_area values (%s,%s,%s)',(n,area,city_name))
conn.commit()
n+=1
市和拼音映射表
爬取下来后需要检查数据,要确保拼音和城市唯一映射,后来果然发现热门城市和下面省市有重复,这就需要保留唯一性,sql去重一下
58_area
2、饿了么案例
同事爬取饿了么网站时候,解析出的数据只有city_id,并没有省市,一开始想着从地址里提取,测试了下,发现很多地址省市不规则,提取效果不佳,重新看这个站,想着有city_id应该会有一个地区字典表,但是同事没关注,毕竟他们把数据抓取下来就没事了,重新看饿了么网站,切换城市,看到citys加载进来,点进去一看这不是json存储的数据呢,
浏览器查看
浏览器查看 里面这不有id和name,解析这个url将数据爬下来不就解决了。
#coding:utf-8
import requests
import json
import MySQLdb
url='https://mainsite-restapi.ele.me/shopping/v1/cities'
html=requests.get(url).content
json_data=json.loads(html)
city_code=json_data
for code in city_code:
city_info=json.loads(html)[code]
for city in city_info:
print code,city['name'],city['pinyin'],city['abbr'],city['longitude'],city['latitude'],city['id']
conn = MySQLdb.connect(host="localhost",user="root",passwd="密码",charset="utf8", db='local_db',port=3306)
with conn:
cursor=conn.cursor()
sql="insert into dim_eleme_area values(%s,%s,%s,%s,%s,%s,%s)"
cursor.execute(sql,(code,city['name'].encode('utf8'),city['pinyin'],city['abbr'],city['longitude'],city['latitude'],city['id']))
conn.commit()
解决
三、总结
论题:掌握python爬虫对数据处理有用吗?
论点:有用
论据:58、饿了么爬虫脚本数据处理
结论:有用
今天搬家离公司近了,可以有更多的时间学习,美美的睡一觉了~
搬家ing
网友评论
这是一本好书