def

【Python3爬虫】拉勾网爬虫

天大地大妈咪最大 提交于 2020-11-22 06:55:43
一、思路分析: 在之前写拉勾网的爬虫的时候,总是得到下面这个结果(真是头疼),当你看到下面这个结果的时候,也就意味着被反爬了,因为一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会禁止这个IP的访问: 对于拉勾网,我们要找到职位信息的ajax接口倒是不难(如下图),问题是怎么不得到上面的结果。 要想我们的爬虫不被检测出来,我们可以使用代理IP,而网上有很多提供免费代理的网站,比如 西刺代理 、 快代理 、 89免费代理 等等,我们可以爬取一些免费的代理然后搭建我们的代理池,使用的时候直接从里面进行调用就好了。 然后通过观察可以发现,拉勾网最多显示30页职位信息,一页显示15条,也就是说最多显示450条职位信息。在ajax接口返回的结果中可以看到有一个totalCount字段,而这个字段表示的就是查询结果的数量,获取到这个值之后就能知道总共有多少页职位信息了。对于爬取下来的结果,保存在MongoDB数据库中。 二、主要代码: proxies.py(爬取免费代理并验证其可用性,然后生成代理池) 1 import requests 2 import re 3 4 5 class Proxies: 6 def __init__ (self): 7 self.proxy_list = [] 8 self

使用Request+正则抓取猫眼电影(常见问题)

巧了我就是萌 提交于 2020-11-22 06:52:07
目前使用Request+正则表达式,爬取猫眼电影top100的例子很多,就不再具体阐述过程! 完整代码github:https://github.com/connordb/Top-100 总结一下,容易出错的问题有: 1.没有加请求头,导致输出没有具体信息! headers={ "User-Agent": "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67..3396.99 Safari / 537.36" } 2.正则出问题: 这个没有好的办法,只能写一点,然后打印输出,看看是否正确输出,常见的问题:另起一行要有+号;另起一行的时候头尾要有引号; 具体要抓取的内容要用(); pattern=re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?title="(.*?)".*?star">(.*?)</p>.*?setime">(.*?)</p>' +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S) 3.写入文件出现问题: 在写入文件的时候,当你输入f.write(content)会报错,报错内容显示只能写入字符串格式,而不是字典格式,此时解决办法是写入 f.write(json

python抓取猫眼电影列表

南笙酒味 提交于 2020-11-22 06:51:56
抓取地址:http://maoyan.com/board/4 分析url分页规则:http://maoyan.com/board/4?offset=0 其中offset参数值为0到90 用到的库: PyQuery:html解析器,语法类似jquery fake_useragent;用于伪造头部浏览器信息,防爬虫屏蔽 相关代码: import requests from requests.exceptions import RequestException from pyquery import PyQuery as pq from fake_useragent import UserAgent from multiprocessing import Pool import json def gethtml(offset): try : ua = UserAgent() # 防爬虫机制,加入头部信息 headerinfo= { " Accept " : " text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 " , " Accept-Encoding " : " gzip, deflate " , " Accept - Language " : " zh - CN,

抓取猫眼部分信息

陌路散爱 提交于 2020-11-22 06:31:28
import requests import re import json from multiprocessing import Pool def get_one_page(url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', } res = requests.get(url,headers=header) if res.status_code == 200: return res.text else: return None def parse_html(html): html.replace('\n','') pattern = ('<i class="board-index.*?">(. ?)</i>. ?<img data-src="(. ?)". ?</a>. ?<a href. ?>(. ?)</a>. ?<p class="star"(. ?)</p>. ?releasetime">(. ?)</p>. ?integer">(. ?)</i>. ?fraction">(.*?)</i>') items = re.findall

猫眼的数字解密

心不动则不痛 提交于 2020-11-22 05:33:46
话不多说,直接干货走起: 看到了吗?字体加密了。那就找。。定位到加密字体的地方,然后看右边的styles,你是不是看到了与字体相关的名字—font-family,就是他,复制他然后源码里面全局搜索,你会看到如下东西: woff?就是这个字体文件。正则拿下来,接下来是正题 # 获取源码里面的字体加密源码 base_str = re.findall(r " base64,(.*?)\) " ,response.text)[0] 将base64编码的字体字符串解码成为二进制格式,写成.woff文件,再通过BytesIO 把一个二进制内存块当成一个文件来操作 def make_font_file(base64_string: str): # 将base64编码的字体字符串解码成为二进制格式 bin_data = base64.decodebytes(base64_string.encode()) with open( ' testotf.woff ' , ' wb ' ) as f: f.write(bin_data) return bin_data def convert_font_to_xml(bin_data): # BytesIO把一个二进制内存块当成一个文件来操作 font = TTFont(BytesIO(bin_data)) # 将解码字体保存为xml font

阿里云oss存储图片

♀尐吖头ヾ 提交于 2020-11-22 03:37:57
单线程版-上传网络流 import pymysql import oss2 import requests import logging # 添加日志 logging.basicConfig( level=logging.INFO, # 定义输出到文件的log级别,大于此级别的都被输出 format='%(asctime)s %(filename)s %(levelname)s : %(message)s', # 定义输出log的格式 datefmt='%Y-%m-%d %H:%M:%S', # 时间 filename='Error.log', # log文件名 filemode='a') # 写入模式“w”或“a” class osss(object): def __init__(self): self.db = pymysql.connect(host='', port=3306, database='spider_yu', user='spider', password='', charset='utf8') # self.db = pymysql.connect(host='127.0.0.1', port=3306, database='shuo', user='root', # password='root', charset='utf8') self.cursor =

[LeetCode] 349. Intersection of Two Arrays 两个数组相交

别等时光非礼了梦想. 提交于 2020-11-22 03:22:33
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2] Example 2: Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4] Note: Each element in the result must be unique. The result can be in any order. 解法:由于结果中要求元素是唯一的,所以用set来统计num1 中的数字。再循环num2中的数字,在set中存在就记录到结果中,同时从set中删除。 Java: HashSet, T: O(n) class Solution { public int[] intersection(int[] nums1, int[] nums2) { HashSet<Integer> set = new HashSet<Integer>(); ArrayList<Integer> res = new ArrayList<Integer>(); //Add all elements to set from array 1 for(int i =0; i<

Django组件-ContentType

北慕城南 提交于 2020-11-22 02:00:03
ContentType组件 ContentType是Django的内置的一个应用,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中。 当项目做数据迁移后,会有很多django自带的表,其中就有django_content_type表 ContentType组件应用 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type 在model中定义PositiveIntergerField字段, 用来存储关联表中的主键,通常用object_id 在model中定义GenericForeignKey字段,传入上面两个字段的名字 方便反向查询可以定义GenericRelation字段 postman from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation # Create your models here. class Food(models.Model): """ id title 1 面包 2 牛奶 """

flask第三方插件DBUtils

巧了我就是萌 提交于 2020-11-21 23:55:25
django中有强大的ORM支持我们来操作数据库, 但是flask没有提供对数据库的操作, 依然还是需要第三方的支持, 来提高我们的开发效率. 下载DBUtils 使用DBUtils 使用DBUtils只需要实例化, 就会产生一个数据库的连接池, 但是实例化过程中会有一些参数来定义连接池 DBUtils参数解释 POOL = PooledDB( creator =pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set

Python argparse

烂漫一生 提交于 2020-11-21 15:48:56
怎样让自己写的脚本看上去更加的专业,当然是有 --help 或者 -h 这个功能。 Python自带的argparse 模块能够很容易的帮我们实现这个功能。 直接上代码: import argparse VERSION = (0, 2) __version__ = '.'.join(map(str, VERSION[0:2])) __description__ = 'HTTP Proxy Server in Python' __author__ = 'Abhinav Singh' __author_email__ = 'mailsforabhinav@gmail.com' __homepage__ = 'https://github.com/abhinavsingh/proxy.py' __license__ = 'BSD' def main(): parser = argparse.ArgumentParser( description='proxy.py v%s' % __version__, epilog='Having difficulty using proxy.py? Report at: %s/issues/new' % __homepage__ ) parser.add_argument('--hostname', default='127.0.0.1', help