爬虫小汇总

Table of Contents

request 使用get爬取

get函数适合静态网页
get一般传入三个参数
url:网页的URL
headers:表头,包含cookies等信息
timeout:最长相应时间
import requests
import time
import re 
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}
def get_std_info(page):
    w = requests.get(f'http://std.samr.gov.cn/gb/search/gbAdvancedSearchPage?tid=2&std_p10=2011-12-01&std_p11=2013-12-31&sortOrder=asc&pageSize=50&pageNumber={page}',headers =header,timeout=10 )
    w.encoding = w.apparent_encoding
    return pd.DataFrame(w.json()['rows'])[['ACT_DATE','C_C_NAME','C_STD_CODE','ISSUE_DATE','STATE','STD_NATURE','id']]

request 使用post爬取

post用于动态网页爬取,需要在network中找到网页返回的JSON文件,然后抓取
PSOT需要向网页提交申请 所以需要附带信息,通过网页观察。
Data形势传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQ5CmeIf-1620528864652)(attachment:image.png)]

# 定义表头、url和post的data参数
header = {'cookie': 'EDUWEBDEVICE=bb5489f443964ee181e9a14c09814664; __yadk_uid=LqHB5kOEBbbL0kPIwxiZueVnLhai0zBk; WM_TID=tqU6%2FbJoxCZAVVFQFQJ6VjsKmzlbjpwz; bpmns=1; hasVolume=true; videoVolume=1; videoRate=2; NTESSTUDYSI=ac857d3f7aa1456f9fb9c3405297f4b9; Hm_lvt_77dc9a9d49448cf5e629e5bebaa5500b=1603701352,1603770381; WM_NI=q7QCsILAV4vfIImy2UAvO4mSrgpg1iZ8UugKWgYZn7COdjI8ycH8ubbHV2TXgaXDwXNRhprTmXmZK6eC4%2BGlDnFPBKjSNbwYiXTSzw3zQQdgMPPSjJuoXE9bs644ix58dEk%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb0ae49a5bab9b7db2592a88ab3c44f978a9faff842afed9aabb43f898b8cb1ec2af0fea7c3b92ab3e99fa4f243909f9ad5f56e8b97a39ab15f83aa81d5f059b2b9c088b4639ae89b96e64195b997bbed3d8191ac8bcc34bbbd88d9f86aa2989ad3d754a5bf98a5f6548e8ea891f160af88a3bbca3ea79dfcccc66888b28ab1c141aa8d8283f653ab889cb4f97df1a69fb2e76d8f90a0b4e942b7b198a6bc6ab1eafcd5ec74f7e8aca6ea37e2a3; Hm_lpvt_77dc9a9d49448cf5e629e5bebaa5500b=1603784565',
          'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}
url = 'https://www.icourse163.org/web/j/mocCourseV2RpcBean.getCourseEvaluatePaginationByCourseIdOrTermId.rpc?csrfKey=ac857d3f7aa1456f9fb9c3405297f4b9'
dat = {'courseId': '1002421002',
       'pageIndex': '48',
       'pageSize': '20',
       'orderBy': '3'}

# 定义爬取函数 
def get_comment(dat):
    res = requests.post(url, headers=header, data=dat)
    result_1 = res.json()
    mark = [i['mark'] for i in result_1['result']['list']]
    content = [i['content'] for i in result_1['result']['list']]
    commentorId = [i['commentorId'] for i in result_1['result']['list']]
    userNickName = [i['userNickName'] for i in result_1['result']['list']]
    termId = [i['termId'] for i in result_1['result']['list']]
    gmtModified = [i['gmtModified'] for i in result_1['result']['list']]
    comment = pd.DataFrame({'mark': mark, 'content': content, 'commentorId': commentorId,
                            'userNickName': userNickName, 'termId': termId, 'gmtModified': gmtModified})
    return comment
payloadData 形势传递
payloadData = {
    'limit': "100",
    'page': "1",
    'q': "ALL_AN:(三一重工) AND ISD:[20010101 TO 20130101]",
    'size': "100",
    'sort': "asc",
    'view_type': "tablelist",
    'with_count': True,
    '_type': "query"}

res = requests.post(url, headers=header, data=json.dumps(payloadData))

selenium

selenium 适用于requests无法解决问题
主要速度比较慢
from selenium import webdriver
import time
# 创建浏览器对象
driver = webdriver.Chrome()
# 进行伪装 装成浏览器
option = webdriver.ChromeOptions()
option.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"')
driver = webdriver.Chrome(chrome_options=option)
# 请求页面
driver.get('https://www.baidu.com/')
# 页面点击和输入
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("chrome")
driver.find_element_by_xpath('//*[@id="su"]').click()
# 延迟5秒
time.sleep(5)
# 截屏
driver.save_screenshot('chrome.png')
# 获取渲染之后的全部数据/获取cookies/获取当前url
driver.page_source
driver.get_cookie()
driver.current_url
# 关闭页面/关闭浏览器
driver.close()
driver.quit()
# 通过标签的xpath获取标签 多个加s
driver.find_element_by_xpath()
# 通过标签的ID/属性名称/标签中保函的文本定位标签(精确定位)/定位所有保函文本的标签/通过标签名
driver.find_element_by_id()
driver.find_element_by_class_name()
driver.find_element_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_tag_name()
# 获取定位标签中文本信息
s_1 = driver.find_element_by_xpath('//*[@id="5"]/div[1]/div/div[2]/p[1]').text
print(s_1)
# 获取定位标签中属性为href的属性值
s_2 = driver.find_element_by_xpath('//*[@id="5"]/div[1]/h3/a').get_attribute('href')
print(s_2)

# 获取所有窗口 - 转移至所有窗口之中的第一个
windows = driver.window_handles
driver.switch_to.window(windows[0])

# 前进/后退
driver.forward()
driver.back()

Xpath 网页解析

网页爬取之后解析也是一个工作
一般使用re和xpath进行信息提取
from lxml import etree
tree = etree.HTML(w.text)  # 将网页源代码转化
s_1 = tree.xpath('//html/body/div[1]/tr')
# 查询html 下 body 下第一个div下所有tr的元素
s_1 = tree.xpath('//html/body/div[1]/tr[1]')
# 查询html 下 body 下第一个div下第一个tr的元素
s_1 = tree.xpath('//html/body/div[1]/tr[1]/a/text()')
# 查询html 下 body 下第一个div下第一个tr的元素下的a标签中的文本信息
s_1 = tree.xpath('//html/body/div[1]/tr[1]/a[@class = "xx"]/text()')
查询html 下 body 下第一个div下第一个tr的元素下的a标签属性为“xx”的文本信息
s_1 = tree.xpath('*[@class = "xx"]/text()')
# 查询所有中标签属性为“xx”的文本信息
s_1 = tree.xpath('//html/body/div[1]/tr[1]/a/@class')
# 查询html 下 body 下第一个div下第一个tr的元素下的a标签的属性信息 也就是xx
s_1 = tree.xpath('//div[1]/tr[1]/a/@class')
# 上面因div[1]是唯一的 所以可以直接根目录为div[1] 不能把根目录设为tr[1]因为 [2]中也有tr[1]
s_1 = tree.xpath('//li[starts-with,(@class,'item-')]')
# 提取所有li中class属性以item开头的元素
s_1 = tree.xpath('string(//div)')
# 提取div下面的所有文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值