import re # 引入正则表达式
import json # 引入 json
import pymongo # 引入mongo数据库
import requests # 引入HTTP请求协议
from hashlib import md5 # 引入MD5
from bs4 import BeautifulSoup #引入BeautifulSoup 信息查询框架
from multiprocessing import Pool # 引入 多线程池
from urllib.parse import urlencode #引入网页解析
from json.decoder import JSONDecodeError #引入json错误异常
from requests.exceptions import RequestException #引入 HTTP异常 from config import * #导入数据库配置信息 client = pymongo.MongoClient(MONGO_URL,connect=False)
db = client[MONGO_DB] # 抓取索引
def get_page_index(offset,keyword):
# 构造请求数据信息
data ={
'office':offset, # 默认页码
'format': 'json', # 数据格式
'keyword': 'keyword', # 关键字
'autoload': 'true',
'count': '20',
'cur_tab': 3,
}
url = 'http://www.toutiao.com/search_content/?' + urlencode(data)
try:
response = requests.get(url)
# 判断是否有正常获取到网页信息
if response.status_code == 200:
# 如果访问正常泽返回数据,否则为空
return response.text
return None
except RequestException:
print('请求索引出错')
return None def parse_page_index(html):
try:
data = json.loads(html)
if data and 'data' in data.keys():
for item in data.get('data'):
yield item.get('article_url')
except JSONDecodeError:
pass def get_page_detail(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
print('请求详情页出错',url)
print(url) def parse_page_detail(html,url):
soup = BeautifulSoup(html,'lxml')
title = soup.select('title')[0].get_text()
print(title)
images_pattern = re.compile('var gallery = (.*?)',re.S)
result = re.search(images_pattern,html)
if result:
data = json.loads(result.group(1))
if data and 'sub_images' in data.keys():
sub_images = data.get('sub_images')
images = [item.get('url') for item in sub_images]
for image in images: download_image(image)
return {
'title':title,
'url':url,
'images':images, } def save_to_monogo(result):
if db[MONGO_TABLE].insert(result):
print('存储到MonogoDB成功',result)
return True
return False def download_image(url):
print('正在下载',url)
try:
response = requests.get(url)
if response.status_code == 200:
# return response.text
save_image(response.content)
return None
except RequestException:
print('请求图片出错出错',url)
return None def save_image(content):
file_path = '{0}/{1}.{2}'.format(ls.getcwd(),md5(content).hexdigest(),'jpg')
if not os.path.exists(file_path):
with open(file_path,'wb') as f:
f.writable(content)
f.close() def main(offset):
# html = get_page_index(0,'街拍')
html = get_page_index(offset,KEYWORD)
for url in parse_page_index(html):
html = get_page_detail(url)
if html:
result = parse_page_detail(html,url)
if result: save_to_monogo(result) print(result)
if __name__ == '__main__':
# main()
groups = [x*20 for x in range(GROUP_START,GROUP_END + 1)]
pool = Pool()
pool.map(main, groups)

python AjaxSpider 代码演示的更多相关文章

  1. python 类继承演示范例的代码

    把做工程过程重要的代码片段备份一次,下面的资料是关于python 类继承演示范例的代码. # a simple example of a class inheritance # tested with ...

  2. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  3. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  4. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  5. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

  6. 14种网页jQuery和css3特效插件代码演示

    1.网页table增删样式代码 演示和下载地址 2.jQuery左右滑动幻灯片插件 演示和下载地址 3.jQuery文字轮播焦点图 演示和下载地址 4.网页文字焦点图切换 演示和下载地址 5.jQue ...

  7. 9种jQuery和css3图片动画特效代码演示

    1.自由旋转的jQuery图片 演示和下载地址 2.css3阴影动画效果 演示和下载地址 3.拉窗帘特效图片 演示和下载地址 4.css3文字特效动画 演示和下载地址 5.css3时钟代码 演示和下载 ...

  8. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  9. javascript 压缩空格代码演示

          压缩空格代码演示 主要是讲解 压缩一个字符串两段空格          例如:javascript函数里的空格不论是这样     var s = "Hello World     ...

随机推荐

  1. Seay源代码审计系统的配置和安装

    2014年7月31日 Seay源代码审计系统2.1 时隔刚好一年之久,源代码审计系统再次更新,这次主要优化审计体验,优化了漏洞规则,算是小幅更新,原来使用者打开程序会提示自动更新. 1.优化原有规则, ...

  2. Alpha版本项目展示得分

    团队名称 得分 newbe 80 C705 100 ourteam 60 sevens 50 sixsix 190 dxteam 75 hots 200 Echo 90

  3. Practice1小学四则运算

    本次实验是做一个自动生成小学四则运算的小程序,对于我来说是检验基础的一次实验,要运用Visual C++来编写完成,“自动生成”第一印象是要用到Random()函数,“加减乘除”则应该用到switch ...

  4. 第二个spring冲刺第4天

    今天,我们团队参考了其他团队的四则运算的程序,发现很多地方可以学习. 1.别人的界面比较唯美,我们做的有点粗糙,所以这个必须要改善. 2.别人的具有较多的功能,比如计时器,我们要效仿. 3.还有难度选 ...

  5. 使用Samba服务程序,让linux系统之间共享文件

    yum  install -y   cifs-utils mkdir  /database    创建挂载目录 在root家目录创建认证文件(依次为SMB用户名.SMB用户密码.SMB共享域)   v ...

  6. 正则的replace函数传参使用

    <script> var str = "a1ba2b"; var reg = /a.b/g; str = str.replace(reg,function(a,b){ ...

  7. jar 命令详解

    jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar.它的运行需要用到 JDK 安装目录下 lib 目录中 ...

  8. [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

    本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...

  9. redis后台启动配置

    在cmd窗口启动redis,窗口关闭后再次操作会报错. 将redis安装为服务,可使其在后台启动,无须担心误操作关闭服务窗口. 配置如下: 进入redis目录,输入如下命令执行即可: redis-se ...

  10. Mybatis返回HashMap时,某个字段值为null时,不会保存key

    转载: http://blog.csdn.net/little2z/article/details/38525327 mybatis 的 callSettersOnNulls 问题项目用到mybati ...