python技术入门–爬虫(1)
这是一个信息的时代,如何快速准确的查找信息是当的一个挑战,运用爬虫技术将为你提供巨大便利。写这些一是为了记录自己的学习,一是为了能互相分享交流。
后续无特别说明当前使用工具版本,默认python3.7
一、写一个简单的爬虫
1.爬虫基于网页,而网页一般由三部分组成:(1)HTML(2)CSS(3)JScript,网页的请求过程:
一般通过request发送请求,response响应,请求方式一般常用get,post,head,put其他较少用的如OPTIONS, DELETE, TRACE 和 CONNECT 方法
2.试用get抓取数据
打开某个新闻网页,按F12或者设置中进入开发者模式,查看请求方式为get
请求对象选取中国旅游网:http://www.cntour.cn;网址可以随意替换看看不同网页效果
# -*- coding: utf-8 -*-
import requests
url='http://www.cntour.cn'
strhtml = requests.get(url)
print(strhtml.text)
试用get请求,然后将数据存到strhtml变量中,这时候strhtml是一个URL对象,代表整个网页,strhtml.text表示网页源码
3.试用post方式抓取数据
这里以http://fanyi.youdao.com为列子,进入有道翻译界面,在翻译中输入“我爱中国”,单击翻译,在开发者模式中查看XHR目录下,可以在headers看到请求方式为post,明确请求方式之后开始撰写。
将headers中的URL复制出来,post的请求获取数据的方式不同于get,get可以通过url传达参数,post的参数则需要放置请求实体中–From_date中
响应的字符串数据为json格式,转成字典格式并根据数据结构提取数据,代码如下:(自己需要根据浏览器中实际url填写)
import requests
import json
def get_translate_date(word=None):
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
Form_data = {'i':word, 'from':'AUTO','to': 'AUTO','smartresult': 'dict', 'client':'fanyideskweb',
'salt':'1512399450582','sign':'78181ebbdcb38de9b4a3f4cd1d38816b','doctype':'json',
'version': '2.1','keyfrom':'fanyi.web','action':'FY_BY_CLICKBUTTION','typoResult':'false'}
response = requests.post(url, data=Form_data) # 请求表单数据
content = json.loads(response.text) # 将JSON格式字符串转字典
print(response.text)
print(content)
print(content['translateResult'][0][0]['tgt']) # 打印翻译后的数据
if __name__ == '__main__':
string=input()
get_translate_date(string)
4.解析网页
在介绍get请求中抓取到网页源码,接下来需要从源码中提取数据,这里需要安装bs4和lxml库对源码数据进行解析(python自带html解析器,但不推荐)
代码如下:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
url='http://www.cntour.cn'
strhtml = requests.get(url)
# print(strhtml.text)
strhtml.encoding = 'utf-8'
soup=BeautifulSoup(strhtml.text,'lxml') # lxml解析
data=soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a') # 获取数据
print(data)
获取数据需要使用select(选择器)定位数据,网页中随便选中数据–鼠标光标停留位置右键–检查,之后进入开发者模式,右键高亮数据,选中copy–copy Selector,即可自动复制数据路径,如
数据路径为:“#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a“,此处只表示选中的某一条,将li:nth-child(1)去掉则可获取所有的头条大标题新闻
至此对的get和post有了简单的了解,实际应用中经常会涉及到数据的进一步提取,比如只提取标签或者url,这是可以利用for循环和字典列表基本知识对数据进行提取
下一章介绍用API爬取天气数据和MongoDB的简单使用