爬虫流程:
- 获取网页
- 基础技术:request、urllib、selenium(模拟浏览器)
- 进阶技术:多进程多线程抓取、登陆抓取、突破IP封禁、服务器抓取
- 解析网页
- 基础技术:re正则表达式、BeautifulSoup和lxml
- 进阶技术:解决中文乱码
- 存储数据
- 基础技术:存入txt文件和存入csv文件
- 进阶技术:存入MySQL和MongoDB数据库
数据类型
1、字符串
string = 'He11o World'
2、数字
整数(int),浮点数(float),可以互相转换
int = 7
float = 7.5
3、列表
类似js数组,可放任意类型数据
list = ['str', 1, 3]
4、字典
类键值对
json = { “key1" : "va1ue1", “key2" : "va1ue2"}
# 遍历
for key, value in json.items(): # :相当于{}
print(key,value)d
条件、循环语句
循环条件无 (),循环语句用缩进代替 {}
if else
if elif else
for
while
函数
# 定义函数
def cal(x):
y = x +1
return y
# 调用函数
result = cal(2)
print (result)
对象
__init__ 在创建实例时会自动调用
self参数自动指向实例,不用传参
class Person: # 创建类
def __init__(self, name, age): # __init__() 子实例创建就马上会调用里面的函数
self.name = name
self.age = age
静态网页抓取
豆瓣Top250抓取demo
# 引入模块
import requests
from bs4 import BeautifulSoup
def get_movies():
# 模拟请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i*25)
#get请求(链接,请求头,超时时长)
r = requests.get(link, headers=headers, timeout=20)
print (str(i + 1), "页响应状态码:", r.status_code)
# 解析爬下来的页面
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_= 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print (movies)
获取响应内容
r = requests.get('http://...')
- r.text 服务器响应的内容
- r.encoding 服务器的文本编码
- r.status_code 状态码
- r.content 字节响应体
- r.json() json解码器
传递URL参数
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://...', params = key_dict)
定制请求头
headers = {
'user0agent': 'Mozila/5.0...',
'Host': 'movie.douban.com'
}
r = requests.get('http://...', headers = headers)
发送post请求
key_dict = {'key': 'value1', 'key2': 'value2'}
r = requests.post('http://...', data = key_dict)
正则表达式
re.search('^((?!vuejs).)*$' # 匹配不包含vuejs的字符串
re.findall(".*str1(.*)str2.*", string) # 匹配str1和str2之间的字符串
模板字符串
'./static/{name}'.format(name=_name)