模块三python爬虫

目录

1.库

2.基本请求

完整请求

3.解析网页

Xpath

BeautifulSoup1

 BeautifulSoup2

4.静态实战

5.动态实战

6.Selenium

7.表单模拟登录

8.Cookie模拟登录

9.selenium登录

10.Scrapy(框架)

保存文件法1

保存文件法2

11.实战

步骤

代码

12.终端协议

13.实战


1.

urllib urllib3 requests scrapy( 框架 ) lxml BeautifulSoup 4( 解析器 )

2.基本请求

import requests
url = 'https://edu.tipdm.org/' # 目标
rq = requests.get(url) # 请求
rq.status_code
rq.text
rq.headers
with open('test01.txt','w',encoding='utf=8') as f:
f.write(rq.text)

完整请求

import chardet
import requests
headers={'User-Agent': 'Mozilla/5.0(Windows NT 10.0;win64; x64)
AppleWebKit/537.36(KHTML,like Gecko) Chrome/71.0.3578.98
Safari/537.36'}
response = requests.get(url, headers=headers,timeout=2)
response.encoding = chardet.detect(response.content) #确定编码格式
response.txt #string to save
response.content #bytes to saveXpath

3.解析网页

Xpath

import requests
url = 'https://edu.tipdm.org/' # 目标
rq = requests.get(url) # 请求
rq.status_code
rq.text
rq.headers
with open('test01.txt','w',encoding='utf=8') as f:
f.write(rq.text)
import chardet
import requests
headers={'User-Agent': 'Mozilla/5.0(Windows NT 10.0;win64; x64)
AppleWebKit/537.36(KHTML,like Gecko) Chrome/71.0.3578.98
Safari/537.36'}
response = requests.get(url, headers=headers,timeout=2)
response.encoding = chardet.detect(response.content) #确定编码格式
response.txt #string to save
response.content #bytes to save

BeautifulSoup1

from bs4 import BeautifulSoup
soup = BeautifulSoup(txt,'lxml') # 类型不是txt也不是bytes
soup.a # 标签名称提取第一个
soup.select('p>a') # 所有满足条件的都取,a是p的儿子
soup.select('p>a:nth-child(2)') # 满足条件的第二个
soup.select('body a') # 不确定是儿子还是孙子节点
soup.select('p>a[id="link1"]') # 属性查找
soup.select('p>a:nth-child[1]')[0].get('href') # 获取第一个,且属性为
href的值
soup.select('p>a:nth-child[1]')[0].text # 获取第一个元素不包含[]

 BeautifulSoup2

from bs4 import BeautifulSoup
soup = BeautifulSoup(txt,'lxml') # 类型不是txt也不是bytes
soup.find_all('title')
soup.find_all('li',id="h")

4.静态实战

import requests
from lxml import etree
import pandas as pd
url = 'http://tipdm.com/'
rq = requests.get(url)
rq.text
dom = etree.HTML(rq.text)
product_name = dom.xpath('//li/a[@class="tit"]/text()')
product_desc = dom.xpath('//li/p[@class="desc"]/text()')
data = {
'product_name': product_name,
'product_desc': product_desc
}
data_frame = pd.DataFrame(data) # 数据结构化(数据框)
data_frame.to_csv('deta_frame.csv',index=None,encoding='utf-8-sig')
# 带文件编码形式的utf-8

5.动态实战

核心: url
# 固定文字找url,与网址进行拼接
https://www.ptpress.com.cn/masterpiece/getMasterpieceListForPortal
# 点击网络面板并刷新,搜索按钮(科技改变中国),点击Headers,复制request url
import requests
import json
import pandas as pd
url =
'https://www.ptpress.com.cn/masterpiece/getMasterpieceListForPortal
'
rq = requests.get(url)
data = json.loads(rq.text) # 转换成json格式 rq.text为字符串格式
book_id = [i['bookId'] for i in data['data']] # 为啥是'data',
rq.text字段有'data'
book_name = [i['bookName'] for i in data['data']]
data1 = {
'bookId':book_id,
'bookName':book_name
}
# book_info = pd.DataFrame({'bookId': book_id, 'bookName':
book_name})
book_info = pd.DataFrame(data1)
book_info.to_csv('book_info.csv',index=None, encoding='utf-8-sig')

6.Selenium

自动化测试工具,直接运行在浏览器,模拟真人
打开 Anaconda3 prompt 输入 pip install selenium (自己使用 python 命令行安装也可以,版
本要选 4.4.3 pip install --user selenium==4.4.3
安装 selenium webdriver 插件,进入网站 http://npm.taobao.org/mirrors/chromedriver/ ,根
据版本下载 win_32, 解压的 exe (别打开)放到 python 解释器文件夹
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/home')
with open('page_source.txt','w',encoding='utf-8') as f:
f.write(driver.page_source)
# windows = driver.window_handles
# driver.switch_to.window(windows[0]) 控制哪个窗口
#点击按钮
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) #设置等待时长,10s内没有出现某个按纽就终止
程序
confirm_btn = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#master > div.list > div:nth-child(1) >
div > a > div > img')
)
)
confirm_btn.click()
#搜索并点击
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) #设置等待时长,10s内没有出现某个按纽就终止
程序
search_btn = driver.find_element(By.CSS_SELECTOR,
'#header > div.container > div > div.col-md-8.tools >
div.search > input[type=text]'
)
search_btn.send_keys('Python网络爬虫')
confirm_btn = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#header > div.container > div >
div.col-md-8.tools > div.search > button')
)
)
confirm_btn.click()

7.表单模拟登录

发送请求 提交数据 获取服务器端认可 返回相应数据实现模拟登录
from selenium import webdriver
driver = webdriver.Chrome();
url = 'https://www.ptpress.com.cn/login' #表单提交地址
driver.get(url)
#<img class="verCodeImg" src="/kaptcha.jpg?v=0.017023438803476898"
onclick="verCode(this)">
#'https://www.ptpress.com.cn/kaptcha.jpg?v=0.017023438803476898'#去
掉login等
sess = requests.Session() #解决动态更新问题
verifyCodeUrl = 'https://www.ptpress.com.cn/kaptcha.jpg?
v=0.017023438803476898' # 验证码地质
rq_code = sess.get(verifyCodeUrl)
with open('code.png','wb') as f:
f.write(rq_code.content)
username = 12
password = 12
verifyCode = 'd66a3'
data = {
'username': username,
'password': password,
'verifyCode': verifyCode
}
rq = sess.post(url, data=data) #一次get就要一次post
rq.status_code
rq.url
rq.text

8.Cookie模拟登录

登陆后找Headers 中的Cookie

import requests
from selenium import webdriver
driver = webdriver.Chrome();
url = 'https://www.ptpress.com.cn/login'
driver.get(url)
cookie = 'gr_user_id=11fa9300-6728-7888; caw_tc=
89898989989898c556df2b'
Cookies = {}
for i in cookie.split(';'):
key, value = i.split('=')
Cookies[key] = value
rq = requests.get(url, cookie=Cookies) #以登录状态获取数据
rq.text

9.selenium登录

打开后手动登录
import requests
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://www.ptpress.com.cn'
driver.get(url)
driver.page_source #获取源码

10.Scrapy(框架)

只需对某些东西修改即可,下载器负责代码,爬冲器负责解析,项目管道负责保存为 csv
者数据库文件
创建项目,自定义 items ,编写 Spiders (解析 / 清洗响应数据),编写数据保存脚本
scrapy startproject test01 C:\Users\12822\Desktop\爬虫 #Anaconda3
Prompt编写
打开创建好的文件夹
#终端输入
scrapy genspider spider_title www.tipdm.com #前两句代表生成新的spider,
自定义名字,网址
#刷新后在spiders里面就创建好spider_title
#打开spider_title.py 修改spider_title.py中的start_urls
import scrapy
from test01.items import Test01Item #需要用到自定义字段
class SpiderTitleSpider(scrapy.Spider):
name = "spider_title"
allowed_domains = ["www.tipdm.com"]
start_urls = ["https://www.tipdm.org/gxzj/index.jhtml"] #可修改子
界面
def parse(self, response): #response为下载器弄完的不用修改,进行解析
结果没有变化,但这次是数据框保存的,方法1不是字典也不是list
item = Test01Item() #初始化对象
titles = [each.extract() for each in response.xpath('//*
[@id="t461"]/div/div[2]/h1/a/text()')]
#下方原理 each为每个元素,extract为内容
item['title'] = titles #title是键在items.py获取的
return item
#获取标题的Xpath,浏览器
# //*[@id="t461"]/div[1]/div[2]/h1/a
# //*[@id="t461"]/div[2]/div[2]/h1/a
# //*[@id="t461"]/div[3]/div[2]/h1/a

保存文件法1

#终端执行
scrapy crawl spider_tile -o title.csv #spider_tile是name里面定义的 -o
output

保存文件法2

结果没有变化,但这次是数据框保存的,方法1不是字典也不是list

#打开pipelines.py
import pandas as pd #导包
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class Test01Pipeline:
def process_item(self, item, spider): #用item联动
data = pd.DataFrame(dict(item)) #处理成字典结构,item类似字典,
保存为结构
10.实战
爬取多页数据,包括新闻,时间,浏览次数等(含有二次跳转)
步骤
1.parse(固化,下面的可改):获取每个页面的ur,传递给下个方法
2.parse_url:获取二次页面的url
3.parse_text:解析,获取目标消息
3个方法通过callback实现数据传递
使用scrapy的http模块下的Requests函数进行回调
使用yield获取方法返回值的关键字,可将方法转为生成器
代码
进入Anaconda
输入spider startprojdect .....
data.to_csv('title_pipeline.csv', encoding='utf-8-sig')
#index=None
#打开settings.py启用,取消注释以下代码
#ITEM_PIPELINES = {
# "test01.pipelines.Test01Pipeline": 300,
#}
#终端输入
scrapy crawl spider_title

11.实战

爬取多页数据,包括新闻,时间,浏览次数等(含有二次跳转)

步骤

1.parse (固化,下面的可改):获取每个页面的 ur ,传递给下个方法
2.parse_url :获取二次页面的 url
3.parse_text :解析,获取目标消息
3 个方法通过 callback 实现数据传递
使用 scrapy http 模块下的 Requests 函数进行回调
使用 yield 获取方法返回值的关键字,可将方法转为生成器

代码

进入 Anaconda
输入 spider startprojdect .....
#终端输入
scrapy genspider spider_all www.tipdm.com #前两句代表生成新的spider,自
定义名字,网址
#打开spider_all.py
import scrapy
from scrapy.http import Request # 下载器不会自动的访问每个页面,实现这个
from test02.items import Test02Item #导入数据
class SpiderAllSpider(scrapy.Spider):
name = "spider_all"
allowed_domains = ["www.tipdm.com"]
start_urls = ["https://www.tipdm.org/gxzj/index.jhtml"]
def parse(self, response):
number = int(response.xpath('//*
[@id="t461"]/div[11]/div/a[3]/text()').extract()[0])
# 得到的新闻总页数看最后一页下表,加的extract取内容,加[0]取出第一个值
虽然只有一个值以列表形式呈现,加int,网站的可能是文本内容
url_all =
['https://www.tipdm.org/gxzj/index_{}.jhtml'.format(i) for i in
range(1,number+1)]
# 获取的各个界面url
# 之前的第一个首页是gxzj/index,输入和第二页一样的方式_1后能访问所以不
用特殊访问
for url in url_all:
#yield Request(url, callback=self.parse_url,
dont_filter=True) #callback给谁用,dont没有访问的进行访问,yield为迭代器,
不完整路径
yield Request(response.urljoin(url),
callback=self.parse_url, dont_filter=True)
def parse_url(self, response): #response为上面返回的
urls = response.xpath('//*
[@id="t461"]/div/div[2]/h1/a/@href').extract() #一个界面五个新闻的二次
页面超链接
#第一个界面所以二次链接的集合
for url_sub in urls:
#不完整路径yield Request(url_sub,
callback=self.parse_text, dont_filter=True) #访问每个界面的
yield Request(response.urljoin(url_sub),
callback=self.parse_text, dont_filter=True)
def parse_text(self, response):
item = Test02Item() #进行初始化
item['name'] =
response.xpath('/html/body/div[2]/div/div/div/div[2]/h1/text()').ex
tract()
#
response.xpath('/html/body/div[2]/div/div/div/div[2]/h1/text()').ex
tract() # 进入每个新闻的界面
item['text'] =
'\n'.join(response.xpath('/html/body/div[2]/div/div/div/div[3]/p/te
xt()').extract()) #把多个内容拼接成一个
return item
# https://www.tipdm.org/gxzj/index_1.jhtml
# https://www.tipdm.org/gxzj/index_2.jhtml
# https://www.tipdm.org/gxzj/index_3.jhtml
# 新闻的总页数//*[@id="t461"]/div[11]/div/a[3]
# /html/body/div[2]/div/div/div/div[2]/h1 名字
# /html/body/div[2]/div/div/div/div[3]/p[1] 第一段
# /html/body/div[2]/div/div/div/div[3]/p[4]/text() 第四段
#需要获取所有 所以p去掉
# 打开items.py
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class Test02Item(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field() #保存的数据
text = scrapy.Field() #保存的数据
# 打pipelines.py
import pandas as pd
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class Test02Pipeline:
def process_item(self, item, spider):
data = pd.DataFrame(dict(item)) #转成字典 转成数据框
data.to_csv('new_all.csv', index=None, encoding='utf-8-
sig', header=None)
#打开settings
#取消注释
ITEM_PIPELINES = {
"test02.pipelines.Test02Pipeline": 300,
}
#打开终端
#scrapy crawl spider_all

12.终端协议

Charles
八爪鱼
Appium (开源)

13.实战

爬取单页数据的所有标题
def parse(self, response):
item = XxItem()
titles = [response.xpath('//*
[@id="line_u8_{}"]/a/h3/text()'.format(i)).extract() for i in
range(0, 20)]
#titles = [response.xpath('//*
[@id="line_u8_{}"]/a/h3/text()'.format(i) for i in range(0,
20)).extract() ] for 循环要写在后面
item['title'] = titles
return item

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值