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类型的数据)

Requests库官方文档

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与名字存入二维列表

Beautiful Soup 4.4.0 文档

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)