Clicky

湖塔之间


一只统计狗的代码考试周

Posted on
标签: 代码 

一只统计狗的代码考试周

两个project

  1. python爬虫:爬取sina微博搜索中有关1000个公司的5年内的微博数据,我们简单算一下任务量

    假设平均以该公司为关键词搜索出的微博为5条的话(实际也差不多这样

    然后要爬的微博数大概有 \(1000\times 5\times 365\times 5 = 9125000\) 然后要爬的页数大概有(假设每天微博就1页好了) \(1000\times 5\times 365 = 1825000\) 然而sina大boss大概连爬19个(实际数据,有时20个)页面就会要求你输入验证码。。。

  2. 50G的基因数据match。有一个待查询列表7.4M,需要从50G的22+XY染色体数据中match到有用信息。从数据大小来看还不是很直观,因为所有数据都是存储再数据库中,所有我们可以看一下记录数

    7.4M待匹配的查询列表有55287条记录,待查询列表的字段数和染色体数据的字段数差不多,但不一样

    可以估算一下50G数据的记录数 \(50\times 1024/7.4*55287 = 382,526,270\approx 4\times 10^8\) 嗯,就是这么多!

Proj1:爬虫

爬虫一些简单的操作自己还是会的,所以爬虫的基本代码早已码好,但需要解决的就是频繁出现验证码的问题。

策略1

import time
import random
time.sleep(random.uniform(1,10))

感觉这有跟没有一样。。丝毫对sina大boss不起作用

策略2

随机User-Agent,网上找到一份常用浏览器的User-Agent

import requests
session = requests.Session()
session.get(url,headers = random.choice(User-Agent))

感觉也没有效果

策略3

罢了,试试验证码识别吧(初生牛犊不怕虎。。

采用的是Tesseract-OCR + pytesser. 对于很简单的验证码还是很容易识别的,比如这个

但这也太小瞧了sina了吧,我们遇到的是这样的

歪歪扭扭,试过先二值化再采用中值滤波(因为二值化后噪声很像椒盐噪声),但估计还是歪歪扭扭的原因,始终不能正确识别,遂放弃。

策略4

代理IP。这也是我花的时间最多的一个方法。采用代理IP基本步骤是

  1. 获取代理IP(我是在代理网站上爬的)
  2. 验证代理IP是否可用
  3. 代理IP进行爬虫

但始终困惑我的是代理IP后第一次就需要输入验证码(偶尔会有一两个漏网之鱼,但很少很少,而且这种第二次也会要求输入验证码。。

策略5

上面说了随机User-Agent, 但其实headers中更重要的是cookies. 然而也只有登录的cookie有点用,未登录的cookie感觉没啥用。。然后就去淘宝花了1元去淘宝买了5个账号。测试一下,嗯,可以登录然后放进模拟登录的python程序中。对了,这里提一下,有个地方登录不需要验证码的

策略 6

PhantomJS: 被称作是无头浏览器, 用来解析网页的js内容。因为听说这样可以更像浏览器,然后我就去学了会然后现学现用。嗯,然后发现一个神奇的现象,竟然不需要输入验证码!!!!高兴地连忙把相应程序用phantomJs改写,当我想看看跑出的结果时,傻眼了。。怎么出来了2016年11月份的结果,10月份也有,搜索条件明明是2011年1月份呀?于是输出phantomjs返回的网页结果,发现网页竟然跳转了,没有找到原因,遂作罢。

策略7

嗯嗯,听说ADSL服务器可以产生动态IP,也就是每次拨号都会分配一个新的IP,之前抓取一段时间要求输入验证码应该是IP被sina记住了(只是推测,并不清楚sina的反爬虫机制)。于是又想到了淘宝,也只剩这一个办法了。

策略7

实在不行,那就慢慢爬咯。。手工输入验证码。。

Proj2 Match

想法还是很简单的,就遍历呗,但怎么能够缩短运行时间,我能想到的就是分割,分成不同染色体跑,然后不同染色体又可以分成不同区域跑。嗯,然后我也是这样干的,为了方便编程,我用python,在python调用sqlite3, 通过游标来实现


类似博文:

  • 瞬间
  • 第七天
  • 喝酒
  • 模影
  • 归来仍是少年