一、爬虫的定义、爬虫的分类(通用爬虫、聚焦爬虫)、爬虫应用场景、爬虫工作原理(最后会发一个完整爬虫代码)
二、http、https的介绍、url的形式、请求方法、响应状态码
url的形式:
请求头:
常见响应状态码(可利用响应状态码判断响应状态assert response.status_code == 200):
三、数据请求,获取响应(requests模块,详细使用方法api文档)
中文文档api:http://docs.python-requests.org/zh_CN/latest/index.html
发送请求格式:requests.get(url,headers=headers,timeout=5) #get方式
requests.post("http://www.baidu.com/", data = data,headers=headers) #post大文本传输,不限制长度,post更安全,data参数为字典
session = requests.session() session.get(url,headers)
cookies与session应用:cookies保存在浏览器端、session保存在服务端,利用session类保持会话连接请求页面,但缺点不能请求多、快容易被识别
四、数据提取与分类(json模块、lxml的etree模块)
通常响应数据分为结构化数据与非结构化数据,结构化数据为json格式等,非结构化数据为html页面等
结构化数据多为json格式,利用浏览器抓包工具,找到对应响应的Json字符串,在转化为python数据类型(字典)
非结构化数据多为html页面直接抓取,利用xpath节点选择,抓取对应数据(需掌握xpath元素定位、配合工具Chrome插件 XPath Helper)
五、数据的保存
利用mongodb数据库来存爬取的数据(安装与部署请见mongodb的安装与配置)或直接write保存到本地
五、糗事百科html数据提取与保存代码
importrequestsfrom lxml importetreefrom pymongo importMongoClient
client= MongoClient("127.0.0.1",27017)
collection= client["duanzi"]["qiubai"]def get_url_list(): #1.url的规律,构造一堆url出来
url_list =[]
url_temp= "https://www.qiushibaike.com/8hr/page/{}/"
for i in range(1, 14):
url=url_temp.format(i)
url_list.append(url)returnurl_listdefparse_url(url):
headers={"User-Agnet": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}
r= requests.get(url, headers=headers, timeout=5)
hmtl_str=r.content.decode()
html= etree.HTML(hmtl_str) #使用etree处理,得到elemnet对象,能够使用xpath方法
returnhtmldef get_content_list(html): #3.提取数据
div_list = html.xpath("//div[@id='content-left']/div")
content_list=[]for div indiv_list:
item={}
item["author_img"] = div.xpath("./div[@class='author clearfix']//img/@src")if len(item["author_img"]) > 0: #获取用户的图像图片
item["author_img"] = "https:" + item["author_img"][0]else:
item["author_img"] =None
item["author_name"] = div.xpath("./div[@class='author clearfix']//h2/text()")if len(item["author_name"]) > 0: #获取用户名字
item["author_name"] = item["author_name"][0].strip()else:
item["author_name"] =None#获取性别
item["author_gender"] = div.xpath("./div[@class='author clearfix']/div/@class")if len(item["author_gender"]) >0:
item["author_gender"] = item["author_gender"][0].split(" ")[-1].replace("Icon", "")else:
item["author_gender"] =None#获取年龄
item["author_age"] = div.xpath("./div[@class='author clearfix']/div/text()")if len(item["author_age"]) >0:
item["author_age"] = item["author_age"][0]else:
item["author_age"] =None#获取段子的正文
item["content"] = div.xpath(".//div[@class='content']/span/text()")
item["content"] = [i.strip() for i in item["content"]]#提取点赞的的数量
item["stats_vote"] = div.xpath(".//span[@class='stats-vote']/i/text()")if len(item["stats_vote"])>0:
item["stats_vote"] = item["stats_vote"][0]else:
item["stats_vote"] =None#提取评论数量
item["stats_comments"] = div.xpath(".//span[@class='stats-comments']//i/text()")if len(item["stats_comments"])>0:
item["stats_comments"] = item["stats_comments"][0]else:
item["stats_comments"] =None#提取正文中的文中的图片
item["content_img"] = div.xpath("./div[@class='thumb']//img/@src")if len(item["content_img"])>0:
item["content_img"] = "https:"+item["content_img"][0]else:
item["content_img"] =None
content_list.append(item)returncontent_listdef save_content_list(content_list): #保存
for content incontent_list:print(content)
collection.insert(content)print("*"*100)defrun():#1.url的规律,构造一堆url出来
url_list =get_url_list()#2.遍历url_list,发送请求,获取响应
for url inurl_list:
html=parse_url(url)#3.提取数据
content_list =get_content_list(html)#4.保存
save_content_list(content_list)if __name__ == '__main__':
run()