爬虫的分类:
1,通过网络爬虫(需要遵守robots协议)
robots协议:网站会告诉你什么东西该爬,什么东西不该爬,一旦爬去网站会将你屏蔽掉,通过网络爬虫就需要遵守robots协议(这是一个君子协议!)
https://www.taobao.com/robots.txt
2.自己写的爬虫程序爬取!
既然有爬虫就有反爬虫,爬虫和反爬虫斗争的第一步就是构造请求对象User-Agent ,我们最适合是爬虫语言就是python,java是python爬虫最大的竞争对手,但是java代码笨重,这里我们用python来实现第一个简单的爬虫
先看一下没有重构的User-Agent是一个什么样式的
这里没有重构的User-Aget是Python-urllib/3.6也是就是我们是用python3爬取的,这样网站的运维人员一看就知道我们是爬虫,立马就把我们给干掉了,所以这里我们就需要重构一个User-Agent.
这种User-Agent在网上一查一大把,可以随便用.
在python3 中我们在网上查了一个User-Agent,记住这里是一个字典,绝对不是一个字符串.先这样写,我们知道python是非常灵活的,有很多方法来完成User-Agent的
接下来我们开始一个正式的小爬虫程序,在这里我们爬取的是猫眼电影的一些电影信息,存放在excel文件中.
爬虫的爬取数据的步骤,
1.确定需要爬取的URL的地址(这非常重要,你要直到你要爬取的URL是什么!)
2.由请求模块向URL地址发送请求,并得到网站的响应
3.从响应内容中提取所需要数据(保存,在继续爬取)
这就是我们一个基本的爬虫的思路.一个简单的爬虫前期还需要准备一些库,python提供了强大的请求模块requests
接下来我们分析一下代码:
首先准备好我们所需要的库
这里创建了类,定义了地址和连接mysql数据库,创建游标对象。
class LianJia(object):
def __init__(self):
self.url='https://sh.lianjia.com/ershoufang/pg'
self.db = pymysql.connect(
'127.0.0.1', 'root', '123456', 'lianjiadb', charset='utf8'
)
self.cursor = self.db.cursor()
接下来是获取网页,获得相应,用requests.get方法获取到html的text信息,requests一共有三个参数第一个为地址URL,请求头headers,第三个为timeout:超时时间,超过时间会抛出异常。
#获取网页
def get_page(self,url):
html = requests.get(
url=url,
headers={'User-Agent': random.choice(ua_list)}
).text
# 直接调用解析函数
self.parse_page(html)
这里是解析函数,也就是拿到html中我们想要的东西,这里用到的是正则表达式!拿到只是网页中的一些简单信息
# 解析
def parse_page(self, html):
pattren = re.compile(
'.*?(.*?).*?.*?(.*?)', re.S)
r_list = pattren.findall(html)
# print(r_list)
self.writ_page(r_list)
把拿到的数据写入到数据库中,永久化保存,不要忘记提交数据库!!
#写入数据库
def writ_page(self,r_list):
list=[]
ins='insert into ljdb1 values(%s,%s)'
for i in r_list:
a=i[0],i[1]
list.append(a)
for film in list:
film_name = film[0]
film_link = film[1]
self.cursor.execute(ins,[film_name,film_link])
self.db.commit()
最后为主函数,主函数控制页数,数据爬取完成后关闭数据库!为了尽可能的不让后台管理人员识别出来我们这里随机等待1-3秒中,这也是爬虫和反爬很重要的机制。
#主函数
def main(self):
for page in range(1,101):
print('正在爬取第%d页....' % page)
url=self.url+str(page)
print('网页地址为:',url)
self.get_page(url)
time.sleep(random.randint(1,3))
print('第%d页完成.' % page)
# 断开数据库(所有页爬完之后)
self.cursor.close()
self.db.close()
测试如下
if __name__=="__main__":
start = time.time()
a=LianJia()
a.main()
end = time.time()
print('执行时间: %.2f' % (end - start))
运行如下。。。。
这是一个简单的爬虫也是学习爬虫的开始!爬虫可谓是斗智斗勇啊,学习的道路还很长,这是一个简单的链家数据的!