python抓取网页步骤
爬虫:目标,分析,实施
1.发送请求
使用requests库,发送消息,模拟真实浏览器的请求状态,访问服务器,获取数据。
import requests #请求
# 向网站发送http请求
# >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
# >>> r = requests.delete('http://httpbin.org/delete')
# >>> r = requests.head('http://httpbin.org/get')
# >>> r = requests.options('http://httpbin.org/get')
# 模拟浏览器访问需要定制头部
head = {
"User-agent":""# 需要在浏览器开发者模式找到浏览器的头部
}
# 采用ip代理方法
proxies = {
'http': 'http://110.73.10.186:8123',
'https': 'http://110.73.10.186:8123'
}
# timeout:如果服务器在 timeout 秒内没有应答,将会引发一个异常
timeout = 15
# url:抓取的网址
# data,params代表http请求的参数
resp_get = requests.get(url='http://httpbin.org/get', params={"name":yr "li","name":"he"},head=head,timeout = timeout,)
resp_post = requests.post(url='http://httpbin.org/post', data={"name": "li"},head=head)
url_get = resp_get.url
url_post = resp_post.url
print(url_get)
print(url_post)
# http://httpbin.org/get?name=li&name=he get为地址栏请求,可携带数据
# http://httpbin.org/post post请求数据为隐式,无限制
# 查看状态码,查看网页是否响应,200为响应成功
print(resp_get.status_code,resp_post.status_code)
# 编码格式,查看网页返回的html文本,网页所用的编码格式与编译器编码格式对应 eg:中文乱码
resp = requests.get(url="https://www.baidu.com")
coding = resp.encoding
print("编码",coding)# 可查看网页自己的编码格式
coding = resp.encoding = "utf-8"# 进行格式转换
print("编码",coding)
# 获取响应数据
text = resp.text
print(text)
content = resp.content
print(content)
# content:返回bytes类型的数据,二进制数据,一般抓取一些图片,音频时使用
# text:返回的纯文本(Unicode类型的数据)
2.数据解析
可用正则表达式或python的库解析获取的响应数据(resp.text),这里使用bs4库进行解析
from bs4 import BeautifulSoup #解析类
# 解析内容: 1 数据源 2 html.parser
soup = BeautifulSoup(resp.text, "html.parser")
# Tag 根据标签的名称获取,获取第一个出现的标签,soup.tag选择标签对象
# 剔除标签 .string(文本与元素都拿,如果无返回none) 或.text(只拿文本不拿元素,如果无返回null)
# 获取属性 attrs属性,生成字典属性 通过字典属性getvalue值
print(soup.title)
print(soup.img)
print(soup.img.attrs.get("src"))
# 寻找所有: find_all寻找所有 find 寻找第一个出现
div_list = soup.find_all(name="div", attrs={"class": "caption"})
# 返回一个列表值,列表中包含符合条件的标签
for div in div_list:
# 判断不能None
name = div.h4.string
url = div.h4.a.attrs.get("href")
dic[name] = url# 将url与名字的对应关系传入字典
listurl.append([name,url])# 将url与名字存入二维列表
3.数据存储(附pymsql数据库增删改查方法)
可存储csv文件,或者excel表格,或者文本文件,或者数据库。
如:写入数据库中(python3使用pymsql模块连接数据库)
connection对象支持的方法
cursor() 使用该连接创建并返回游标
commit() 提交当前事务
rollback() 回滚当前事务
close() 关闭连接
cursor对象支持的方法
execute(op) 执行一个数据库的查询命令
fetchone() 取得结果集的下一行
fetchmany(size) 获取结果集的下几行
fetchall() 获取结果集中的所有行
rowcount() 返回数据条数或影响行数
close() 关闭游标对象
import pymysql# as mysql
# 打开数据库连接
# localhost 为 本地连接
# root 为用户名
# password 为密码
# test_data 为数据库
host = "localhost"# 127.0.0.1=本机ip
user = "这里输入mysql用户"
password = "这里输入上面mysql用户的密码"
db = "这里输入本机存在的一个数据库"
port = 3306 # number数据类型
db = pymysql.connect(host=host, user=user, password=password,db = db, port=port)
print("连接成功")
# 获取游标:执行以及编译str类型的sql语句
cur = db.cursor()
# 增删改查
# 创建表结构
# IF NOT EXITS验证当前数据库是否存在 存在1050的异常
cur.execute("CREATE TABLE IF NOT EXISTS user_info(ID INT PRIMARY KEY AUTO_INCREMENT"
",NAME VARCHAR (25))")
# 插入
i = cur.execute("INSERT INTO user_info(NAME) VALUES('LIHUA')")
db.commit()# 提交当前事务
print(i)
# 如果要多值插入只能使用列表
# 如上文的list1
for i in list1:
sql = 'INSERT INTO 表名 VALUES(%s,%s)'
try:
cur.execute(sql,i)
conn.commit()
print('写入成功')
except BaseException as e:
print('导入失败',e)
conn.rollback()
# 修改:返回更新的条目,0:失败 >0:成功
# 格式化字符串: %s:插入string类型
sql = "UPDATE user_info SET name = '%s' WHERE ID = %d "
i = cur.execute(sql%("lihua",1))
db.commit()# 插入 修改
# 查询:需要两层for循环变量 返回结果集 list[[id,name],[id,name]
sql = "SELECT name FROM user_info"
i = cur.execute(sql)
cur.execute(sql)
list = cur.fetchall()# 提交查询动作
for item in list:
print(item [0],item[1])# 根据列表类的字段值
print(i)
#删除:返回更新的条目,0:失败 >0:成功
sql = "DELETE FROM user_info WHERE ID = %d"
i = cur.execute(sql%(1))
db.commit()
print(i)