在现代互联网时代,网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究,还是进行数据分析,掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程,包括网络请求、数据解析、反爬措施、多任务异步爬虫、数据存储和面向对象编程等内容。通过本文的学习,读者将能够掌握从网页上收集信息的基本原理和技术,以及如何将这些信息进行处理和存储。
假设我们在浏览器输入www.example.com这个网址并回车,会发生以下过程:
我用通俗易懂的语言,详细再给你解释一遍网页的加载过程:
区分服务器端和客户端渲染非常重要。服务器端渲染可以减轻客户端压力,客户端渲染可以提供更好的交互体验。现代网页开发通常会结合两种渲染方式的优点。
pip install requests
GET请求用于获取服务器的数据。它通过URL的参数传递请求数据。
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('http://httpbin.org/get', params=params)
print(response.url)
# http://httpbin.org/get?key1=value1&key2=value2
requests会将params字典类型自动转换为url参数。
也可以直接将参数拼接到url中:
import requests
response = requests.get('http://httpbin.org/get?key1=value1&key2=value2')
https://www.baidu.com/s?tn=85070231_38_hao_pg&wd=总结
https://www.baidu.com/s?tn=85070231_38_hao_pg&wd=%E6%80%BB%E7%BB%93
params = {‘tn’: ‘85070231_38_hao_pg’, ‘wd’: ‘总结’}
POST请求用于向服务器发送数据。它通过请求体传递参数。
import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://httpbin.org/post', data=data)
print(response.text)
# {
# "form": {
# "key1": "value1",
# "key2": "value2"
# }
# }
requests会自动编码data字典为表单格式。
也可以直接传递字符串:
data = 'key1=value1&key2=value2'
response = requests.post('http://httpbin.org/post', data=data)
此外,还可以传递JSON数据:
import json
data = {'key1': 'value1', 'key2': 'value2'}
data = json.dumps(data)
response = requests.post('http://httpbin.org/post', data=data)
Form Data形式
http://www.xinfadi.com.cn/priceDetail.html data = {‘key1’:‘value1’, ‘key2’: ‘value2’}response = requests.post(‘http://httpbin.org/post’, data=data)
传递字典即可
Request Payload形式
能直观的看到是json类型的数据
两种方案
User-Agent:标识客户端浏览器信息,可用于反爬检测,表示用户用什么设备发送的请求。
Cookie:网站用于跟踪会话,可检测非正常Cookie来实现反爬,是服务器记录在浏览器上的一个字符串,写入在本地的一个文件中,作用是和服务器保持住会话,在服务器端叫session。(HTTP请求是无状态请求)
Referer:标识来源页面,用来检测上一个url是什么,可检测Referer来防止盗链。
网页自定义参数:这是最难处理的,需要通过逆向工程分析参数算法,找到生成参数的代码逻辑。
import requests
session = requests.Session()
首先导入requests模块,然后调用requests.Session()来创建一个Session对象。
可以通过Session对象的headers属性预设请求头,这些头信息将会应用于该Session实例发出的所有请求:
session.headers = {
'User-Agent': 'Mozilla/5.0',
'Authorization': 'Bearer xxxxxxxxxxxxx'
}
session.cookies.update({
'name': 'value',
'foo': 'bar'
})
通过Session的cookies属性可以预设请求中的Cookies。
response = session.get(url, params=params)
response = session.post(url, data=data)
可以使用Session对象的get()、post()等方法发送请求。
session.close()
当Session使用完后,可以调用close()方法关闭该Session对象。
相比直接使用requests.get()/post()等函数,使用Session对象的好处是:
import re
html = ''
pattern = re.compile(r'var data = "(.*)"')
result = pattern.findall(html)
from lxml import etree
html = etree.HTML(resp.text)
result = html.xpath('//li/text()')
etree的xpath默认返回的是列表.
if ret:
ret[0]
else:
XXX
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
result = soup.find_all('li')
综合来说,正则适合提取固定模式字符串,lxml解析速度快,BeautifulSoup可以应对“烂”文档。
resp_text = response.text
try:
data = response.json()
except:
# 处理异常
import json
data = json.loads(resp_text )
from threading import Thread
import requests
def crawl(url):
r = requests.get(url)
print(r.text)
t1 = Thread(target=crawl, args=('url1',))
t2 = Thread(target=crawl, args=('url2',))
t1.start()
t2.start()
from multiprocessing import Process, Queue
def crawler(q):
data = crawl_page()
q.put(data)
q = Queue()
p1 = Process(target=crawler, args=(q,))
p2 = Process(target=crawler, args=(q,))
p1.start()
p2.start()
import asyncio
async def fetch(url):
print('fetching')
return await aiohttp.get(url)
async def main():
await fetch(url1)
await fetch(url2)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
import csv
# 写入CSV文件
with open('data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
# 写入标题行
writer.writerow(['ID', 'Name', 'Age'])
# 写入数据行
writer.writerow(['1', '张三', 20])
writer.writerow(['2', '李四', 25])
# 读取CSV文件
with open('data.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
# 读取标题
headers = next(reader)
# 读取每行数据
for row in reader:
print(row)
import csv
with open('data.csv', 'w', newline='') as f:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': 1, 'name': '张三', 'age': 20})
writer.writerow({'id': 2, 'name': '李四', 'age': 25})
import pandas as pd
df = pd.read_csv('data.csv')
df.to_csv('new_data.csv', index=False)
df.to_excel( "hehe.xls", header=False,index=False)
csv本质是文本文件
f = open("data.csv", modew" , encoding="utf-8")f.write("1")
f.write(" , ")
f.write("张三")
f.write(" , ")
f.write( '"张,三"')
f.write(" , ")
f.write("5000")
f.write(" \n ")
f.write(" , ")
f.write("张四")
f.write(" , ")
f.write( '"张,四"')
f.write(" , ")
f.write("5030")
f.write(" \n ")
import pandas
r = pandas.read_csv ( "data.csv " , sep="," , headen=None)
print(r)
r.to_excel( "hehe.xls", header=False,index=False)
import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='test')
# 插入数据
cursor = conn.cursor()
cursor.execute("INSERT INTO tb_user VALUES (NULL, '张三', 25)")
conn.commit()
# 查询数据
cursor.execute("SELECT * FROM tb_user")
result = cursor.fetchall()
print(result)
from pymongo import MongoClient
# 连接Mongodb
client = MongoClient('localhost', 27017)
collection = client['testdb']['user']
# 插入文档
data = {'name': '张三', 'age': 25}
collection.insert_one(data)
# 查询文档
results = collection.find({'age': {'$gt': 20}})
for result in results:
print(result)
import redis
# 连接Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
# 字符串操作
r.set('username', '张三')
# 散列操作
r.hset('user', 'name', '张三')
# 列表操作
r.lpush('list', 1,2,3)
目前我们编写的代码属于面向过程:
面向过程注重步骤,按照顺序一步步实现功能。
类似我要喝可乐的过程:
面向对象编程核心在于思维方式的转变:
要实现面向对象需要:
程序员可以自由构思创造对象,然后定义对象的属性和方法。
在Python中通过类(Class)可以创建对象,类是对象的模板,包含对象的属性和方法。
定义一个类:
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def meow(self):
print("喵喵喵")
tom = Cat("汤姆", 3)
tom.meow()
面向对象编程可以提高代码的封装性、继承性和可维护性。需要转换编程思维方式,主要关注对象和类的设计。
本文全面介绍了网页加载、数据处理和存储的关键概念和技术。无论是初学者还是有一定经验的开发者,都能从中受益匪浅。通过掌握这些技能,读者可以更有效地收集和处理网络数据,为各种应用场景提供有力支持。无论是进行数据分析、信息收集、还是网站开发,本文提供了重要的基础知识和实用技巧。希望读者能够积极学习和实践,不断提升自己的技能水平。
特别声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的记录分享学习技术的过程