接到导师的指示,需要使用python 2爬虫爬取一定量的数据,于是马不停蹄的开始了我的python爬虫之旅,经过十天磕磕碰碰的学习后,爬虫终于完成了。这里乘着爬数据的时间,总结一下python爬虫的内容:
首先当然是基础了,python基础可以通过网上的菜鸟教程学习。当然如果仅仅是学习爬虫的话,那后面的高阶内容很大一部分都不需要看。
用python写爬虫第一点当然是获取数据了,一般可以有三种方式
第一种是通过python自带的urllib或者rullib2直接请求html页面,某些简单的网站的数据就在它的html里,可以通过这样的方式直接获取。如:
req = urllib2.Request(url) page = urllib2.urlopen(req).read() 但大多网站的数据都是js生成的,直接通过这种方式是没办法得到想要数据的。 第二种貌似是通过调用浏览器内核还是什么,来模拟用户的点击,然后得到数据,这种方式比较万能,但是很慢,低效,所以这里不讲了(其实是没去了解) 第三种方式和第一种差不多,是第一种的衍生,也就是通过分析想要取得数据的页面的形成方式,来直接请求它里面的数据,比如某些网站的数据是通过json 动态展示的,那我们就直接去模仿浏览器请求json的过程,直接抓取数据,如:
req = urllib2.Request(url) #此处url是由我们自己通过浏览器的f12,然后网洛分析出来的 data = urllib2.urlopen(req).read() 如果是数据需要登陆才能获得,那么可能还要加入headers在请求里,headers可以参照浏览器开发者工具中网络里需要请求的栏目的请求头。 获取到的数据可能是这样的{"code":"1","result":"<li title='否'>有用的数据</li>\n ... ","data":null} 这里import json 用python内自带的json解析就行
data = json.loads(data) data = data["result"] 第二点
是对数据进行解析,这里有那么三种方式,其一,正则表达式,其二beautifulsoup,其三lxml,其中正则表达式较为繁杂,后两个较为简单,这里偷一张图说明:
抓取方法 | 性能 | 使用难度 | 安装难度 |
---|---|---|---|
正则表达式 | 快 | 困难 | 简单(内置模块) |
Beautiful Soup | 慢 | 简单 | 简单(纯Python) |
Lxml | 快 | 简单 | 相对困难 |
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, "html.parser")
results_1 = soup.find_all('strong') #此处可换成其他方法。 第三点
防止网站封你ip,所以许需要使用ip代理,使用过程如下:
proxy = {'http': 'http://110.73.3.175:8123'}
# 设置代理 proxy_handler = urllib2.ProxyHandler(proxy) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) # 访问网页 req = urllib2.Request(url) page = urllib2.urlopen(req).read() 既然开始设置代理了,当然不能只设置一个,你需要一个数量足够的ip代理资源池,免费ip代理 当然,也可以选择付费的,更加稳定。 可以将ip代理中ip以及端口存入本地,需要时更新(我是每次某个ip代理不能正常访问时,就将此代理删除,当本地数量过小,更新它),也可以每次使用都从这个网站获取许多个。 第四点 多线程,这个可以直接参照菜鸟教程中的线程部分第五点
存入数据库,这里提供一个简单的demo,特别注意的是,conn.commit()执行后才会对数据库的内容进行修改。
#coding=utf-8 import MySQLdb conn= MySQLdb.connect( host='localhost', port = 3306, user='root', passwd="", db ='test', charset="utf8", ) #创建数据表 cur.execute("create table student(id int ,name varchar(20),class varchar(30),age varchar(10))") #插入一条数据 cur.execute("insert into student values('1','chen','3 year 2 class','9')") #修改查询条件的数据 cur.execute("update student set class='3 year 1 class' where name = 'chen'") #删除查询条件的数据 #cur.execute("delete from student where age='9'") cur.close() conn.commit() conn.close()