爬虫练习1:
import requests #目标页面 url="https://www.xxx.edu.cn/" #浏览器右键检查,network然后找doc,刷新页面,在文档里找"User-Agent",User-Agent其实就是你的浏览器信息 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", } try: response = requests.get(url, headers=headers) #防止中文乱码 response.encoding = 'utf-8' #它能够判断返回的Response类型状态是不是200。如果是200,他将表示返回的内容是正确的,如果不是200,他就会产生一个HttpError的异常。 if response.status_code == 200: print(response.text[:100]) #response.text可以抓取全页,也可以限制字符如上 except: print("爬取失败")
2爬虫练习,将爬取到的数据生成html文件,分析文件获取目标信息
例如,将学院的专业捕捉出来放在列表里
import requests url = 'https://www.xxx.edu.cn/yqdx/zyyl.htm' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", } response = requests.get(url, headers=headers) response.encoding='utf-8' if response.status_code == 200: print(response.text)
此时获取了网页的信息,再将其写入html文件中
from bs4 import BeautifulSoup x = BeautifulSoup(response.text,'lxml') #使用 lxml 解析器作为底层解析引擎 print(x.prettify()) # 变成规整的 html 格式 bytes_obj = x.prettify().encode() with open('baidus.html', 'wb') as f: f.write(bytes_obj) print('ok')
爬出学院名称,进行整理
from lxml import etree import re parser = etree.HTMLParser(encoding='utf-8') html = etree.parse('baidus.html', parser=parser) str=html.xpath('//body/div//table/tbody/tr/td/p/span/text()') print(str) list=[] for i in str: teststr="学院" #m模糊匹配 r1 = re.search(teststr, i) if r1: #去掉两端的空格 i=i.strip() print(i) list.append(i) print(list)
完成。
这里添加一个html文件的分析,有两种方式可以解析html文件,
1.使用xpath语法,应该使用Element.xpath方法。来执行xpath的选择。
result = html.xpath(‘//li’)
xpath返回的永远是一个列表。
2.获取文本,是通过xpath中的text()函数。示例代码如下:
html.xpath(‘//li/a[1]/text()’)
3.在某个标签下,再执行xpath函数,获取这个标 签下的子孙元素,那么应该在斜杠之前加一个.,代表是在当前元素下获取。
address = tr.xpath(‘./td[4]/text()’)
有一个hello.html的文件,放在python文件的目录下
from lxml import etree parser = etree.HTMLParser(encoding='utf-8') html = etree.parse('hello.html', parser=parser) #list=html.xpath('//head/title/text()') #['法治的细节', '纸质书', '30元', '罗翔'] list=html.xpath('//body/ul/li/text()') #省略中间目录用//代替也是可以的,效果如上 list=html.xpath('//body//li/text()') #多个一样的标签时可以使用[]表示第几个,['纸质书'] list=html.xpath('//body//li[1]/text()') #也可以用其他属性加以区别,输出['纸质书'] list=html.xpath('//body//li[@id="model"]/text()') list=html.xpath('//body//li[@]/text()') print(list)
参考连接:https://blog.csdn.net/qq_44087994/article/details/126417444?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169989476116800225567403%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=169989476116800225567403&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-2-126417444-null-null.nonecase&utm_term=xpath%E7%88%AC%E8%99%AB%E7%BB%93%E6%9E%9C%E6%9C%89%5Cn&spm=1018.2226.3001.4450
第二种方法,Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象
搜索文档书,一般用的比较多的方法就是两个方法,一个是find,一个是find_all。find方法是找到第一个满足条件的标签后立即返回,只返回一个元素。find_all方法是把所以满足条件的表签都返回。
例如仍然是hello文件的解析
from bs4 import BeautifulSoup with open("hello.html", "r", encoding='utf-8') as f: html = f.read() soup = BeautifulSoup(html,'lxml') table = soup.find('ul') trs = soup.find_all('li') for tr in trs: print(tr) print(table)
输出:所有li
练习:对下面文件用不同方法进行解析
小明 收营员 4000 小花 促销员 3500 张三 保洁 3000 李四 收营员 4000 王五 售货员 3800 泡面 3.5 120 火腿肠 1.5 332 矿泉水 2 549 面包 5.5 29