1.读取网页的方式
不同方式要读取百度首页
共同代码import urllib2 import urllib from urllib import request header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} url = "https://www.baidu.com"
python2的写法
request = urllib2.Request(url, headers=header) response = urllib2.urlopen(request) print response.read().decode("utf-8") #返回源码 print response.info() # 返回网页信息 print response.code # 状态码 200 成功, 301,重定向,403拒接访问,404丢失
python3 的写法
request = urllib.request.Request(url, headers=header) response = urllib.request.urlopen(request) print(response.read().decode("utf-8")) response = requests.get(url, headers=header) print(response)
get/post
response = requests.get(url, headers=header) print(response.content.decode("utf-8")) # 有道翻译post url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" response = requests.post(url, headers=header) res = response.content tgt = json.loads(res) # 返回一个json数据 print(tgt["translateResult"])
handler
import urllib.request urllib.request.urlopen() # 特殊的Handler handler = urllib.request.HTTPHandler() # http 构建一个Handler处理器 handler = urllib.request.HTTPSHandler() # https opener = urllib.request.build_opener(handler) # 创建一个打开器 ''' 参数fullurl, data=None, timeout ''' response = opener.open("http://www.baidu.com") # 打开 print(response.read().decode("utf-8")) urllib.request.HTTPSHandler() # 处理https
2.解析网页的方式
正则表达式
findall()括号里面的参数('写好的正则表达式', '要匹配的内容') response = re.findall() #返回一个列表 例子 jobre = "<em>(\d+)</em>" print(re.findall(jobre, response.text)[0])
Beautifulsoup
Beautifulsoup()括号里面的参数可以写读取的网页和解析器(html5lib 和lxml) soup = Beautifulsoup(response, lxml) select()括号里面参数可以写要解析的内容规则 soup.select("#position_detail > div > table")
xpath
首先把网页转换成lxml的etree的格式 HTML() 括号;里面的参数是要读取的网页 myTree = lxml.etree.HTML(HTML) cityList = myTree.xpath("//div[@class=\"maincenter\"]/div[2]/div[2]/div/a") # 城市列表
三中方式爬取智联招聘上的职位数量
import requests import lxml from lxml import etree from bs4 import BeautifulSoup import re header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} url = "https://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%B9%BF%E5%B7%9E&kw=python%20&sm=0&p=1" response = requests.get(url, headers=header) print(response) html = lxml.etree.HTML(response.text) jobNum = html.xpath("//span[@class=\"search_yx_tj\"]/em/text()") print(jobNum[0]) # 返回一个列表 soup = BeautifulSoup(response.text, "lxml") # span.search_yx_tj > em print(soup.select("span.search_yx_tj > em")[0].text) print(soup.find("span", class_="search_yx_tj").em.get_text()) """ <em>1635</em> """ jobre = "<em>(\d+)</em>" print(re.findall(jobre, response.text)[0]) # //div[@class="maincenter"]/div[2]/div[2]
3.一些细节
urllib.urlencode() #url编码 urllib.unquote() #url解码 py2 和 py3 的区别: Python2 raw_input() / print response Pythin3 input() / print(response) 代理IP: httpProxy = {"http":"10.3.123.45:808"} #代理IP proxy = urllib.request.ProxyHandler(httpProxy) #创建一个代理处理器 opener = urllib.request.build_opener(proxy) #创建一个打开器 urllib.request.install_opener(opener) # 安装全局opener urllib :read() request: text 返回文本 / content 返回字节 Beautifulsoup: soup.find('p') #第一个标签的所有结果 soup.find_all('p') #找到所有的匹配结果,返回一个列表 soup.find_all(re.compil e("^p")) #使用正则,re.compile()预处理 soup.find_all(text=re.comlile("e")) #查询有"e"的文本 soup.select("p b") #p标签下的所有b标签 soup.select("p > b") #p标签下子节点的b标签 jobnum=soup.find("span",class="search_yx_tj") jobnum=soup.find("span",attrs={"class":"search_xy_tj"}) 提取数字:print(jobnum.em.string) 提取文本方式:string/text/get_text() %s 便于人阅读 类型:text %r 便于机器阅读 类型:字符串 xpath: # /根节点 文档结构要完整 # //全局 返回一个列表 文档结构可以不完整 # ./ 当前的节点 # .. 当前上一级父级 # @ 属性 # * 所有的符合的结果 # | 或者 # //div/ul 层级 第二个/(子节点) # //div//ul 两个// 孙子节点 # //ul[1] 定位(ul下的第一个节点) # //ul/li/text() ul下的li下的文本 # li.xpath("./a/@href='link1.html'") 判断,存在返回True