1使用post请求爬取数据
当网页中的数据不是以get请求获取到的时候,就需要使用post请求去获取数据。
import json
import re
import requests
from agent_helper import *
from u17_db_helper import *
from mongo_helper import *
db = get_connection()
cursor = get_cursor(db)
def get_page(page):
# 提交地址为xhr下headers中Request URL中的地址,不是网页地址
post_url = 'http://www.u17.com/comic/ajax.php?mod=comic_list&act=comic_list_new_fun&a=get_comic_list'
session = requests.Session()
# 拼接form data数据
post_data = {'data[group_id]': 'no', 'data[theme_id]': 'no','data[is_vip]': 'no', 'data[accredit]': 'no',
'data[color]': 'no', 'data[comic_type]': 'no', 'data[series_status]': '1', 'data[order]': '1',
'data[page_num]': '%d'%page, 'data[read_mode]': 'no'
}
agent = get_random_agent()
headers = {
'Referer': 'http://www.u17.com/comic/ajax.php?mod=comic_list&act=comic_list_new_fun&a=get_comic_list',
'User-Agent': agent,
'Host': 'www.u17.com',
'Accept': 'application/json, text/javascript, */*;', # headers中requests headers中的accept数据
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4,zh-TW;q=0.2,mt;q=0.2',
'Connection': 'keep-alive',
'X-Requested-With': 'XMLHttpRequest',
}
# 提交请求
response = session.post(post_url, data=post_data, headers=headers)
if response.status_code == 200:
return response.text
return None
def parse_html(html):
json_result = json.loads(html)
data_list = json_result['comic_list']
pattern = re.compile('(.*?)<.*?', re.S)
for item in data_list:
comic_id = item['comic_id']
name = item['name']
cover = item['cover']
update_type = item['update_type']
line1 = item['line1']
line2 = re.findall(pattern, item['line2'])[0]
dict1 = [comic_id, name, cover, update_type, line1,line2]
# 插入到mysql数据库
insert_manhua(db, cursor, list1)
def main():
for page in range(37):
html = get_page(page+1)
parse_html(html)
if __name__ == '__main__':
main()
session = requests.Session():创建session对象
postdata = {'page': '%d'%page, 'pagesize': '9'}:拼接XHR中Headers中的Form Date数据,全部照原样拼。不能作改动。
post_url = 'https://www.qichamao.com/cert-wall':提交地址为xhr下headers中Request URL中的地址,不是网页地址
response = session.post(post_url, data=postdata, headers=headers):提交post请求并获取响应
json_result = json.loads(html):将动态获取到的json数据python化
headers中拼接的请求头需参照xhr下headers中的数据格式。
2mongodb的使用
MongoDB 是一个介于关系数据库和⾮非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
非关系型数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。
模式自由、支持简易复制、简单的API、大容量数据等。
MongoDB最大的特点:它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言, 几乎可以实现类似关系数据库单表查询的绝大部分功能。它是一个⾯面向集合的,模式自由的文档型数据库。
2.1mongodb特点
1.面向集合:意思是数据被分组存储在数据集中, 被称为一个集合,每个集合在数据库中都有一个唯一的标识名;集合的概念类似关系型数据库(RDBMS)⾥的表(table),不同的是它不需要定义任何模式(schema)。
2.模式自由:存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。
3.文档型:意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型, 包括数组和文档. 文件存储格式为 BSON(一种 JSON 的扩展)
2.2使用命令
在使用前需要先配置环境变量
以下命令都是在客户端(mongo)中使用
show dbs;查看数据库
use taobao ;打开数据库
show collections;查看集合(类似查看表格)
文档(Document)是MongodDB中的核心概念,他是MongoDB逻辑存储的最小基本单 元, 对应mysql中的记录
集合(collections):多个文档组成的集合 对应mysql中的table(表格)
数据库(dbs):多个集合组成的数据库 对应mysql中的database
创建数据库
use newdb1 ;
show dbs ;
数据库并没有添加,当我们在给数据库中的集合插入一条文档的时候就会自动创建一条文档、一个集合、一 个数据库。
db.users.insert({"name": 'carmack'}) ;
show colletions;
插入数据并查看表格
db.users.find();查询所有数据
db.users.findOne({"uid":2});查询uid为2对应的数据
db.users.remove({"uid":2});删除uid为2对应的数据
db.users.remove({});清空集合(表格)
db.users.drop();删除集合
db.users.update({"uid":2},{"uname":"jon"});更新文档。第一个文档为查询的文档,第二个文档为修改为什么的文档, 后面的文档会覆盖我们要修改文档的整个内容
使⽤用修改器器inc":{"salary":100}})对uid为2的人的sarlary数据在原基础上加100
db.users.update({"uid":2},{"set修改器 :给uid为2 的人添加一个年龄字段。
db.users.update({"uid":2},{"unset修改器
:删除一个字段
db.users.update({"uid":2},{"pushAll":{"email":["a", "b","c","d"]}});addToSet":{"email":"d"}});addToSet":{"email":{"eache操作符;
db.users.update({"uid":2},{"pop":{"email":1}})#从右侧删除一个元素 db.users.update({"uid":2},{"pullAll":{"email":["b","c"]}}) #删除数组内指定的多个元
素
db.users.update({"uid":2},{"$set":{"email.0":"tim.qq.com"}})数组中某个元素需要更新,通过数组.下标修改
2.3大小于
db.users.find({"salary":3000}).pretty();等于
db.users.find({"salary":{lte:3000}}).pretty() 小于等于
db.users.find({"salary":{gte:3000}}).pretty() 大于等于
db.users.find({"salary":{or: [ {key1: value1}, {key2:value2}]} ).pretty();或者(or)
db.users.count()拿到users表中的主键
3python中使用mongdb进行存储
from pymongo import MongoClient
# 创建客户端
client = MongoClient()
# 没有就创建u17数据库,有就打开
db = client.u17
# 定义一个插入数据的函数
def insert_record(item):
# 没有就创建maohua集合(表格),有就打开,并向其中添加数据
db.manhua.insert(item)
#循环添加数据
for item in data_list:
.............
# 将取到的数据组合成字典形式
dict1 = {'name': name, 'cover': cover, 'line1': line1}
# 调用插入数据函数
insert_record(dict1)
向mongodb中存数据,数据必须以字典的形式传入;从mongodb中取数据,筛选条件也必须以字典形式传入;mongo中在不存在的数据库中插入数据;其会自动创建。mongod 表示服务端;mongo表示客户端
4在django中从mongodb中取数据
在views中取数据
def comic_list(request):
# 创建客户端
client = pymongo.MongoClient()
# 打开u17数据库
db = client['u17']
# 在u17数据库中取manhua集合中的所有数据
manhua_results = db.manhua.find()
context = {'manhua_results': manhua_results}
return render(request, 'comic_list.html', context)
在模板中渲染数据
{% for item in manhua_results %}
{{ item.name }}
{% endfor %}