上午废了老大劲成功登陆后,下午看了下BeautifulSoup和pymysql,晚上记录一下

自己电脑装的sublime,字体颜色竟然拷贝不下来 - -

写的过程中遇到了很多问题:

1.模拟登陆部分

模拟登陆看相关教程都是要用的cooklib,但是py3.x不支持这个库,换了http.cookiejar也遇到了一大堆坑,最后发现了request带的有cookie,可以拼装cookie,

然后用alert(document.cookie)获取cookie去拼cookie抓页面,但是每次抓到的都是跳转页面,一度绝望准备放弃,直到N小时候的探索候,发现了httpfox+firedebug!

简直是神器,发现之前alert时获取的cookie少了一个参数,加上去之后神奇的登录上去抓下来页面了,自学大概就是这样吧~碰运气。

2.网站结构分析

今天的目标网站是一个B2B2C网站,爬取的内容是后台的用户数据。

网站结构比较老,需要抓取的数据在table里,每行tr都有一条数据,这个可以直接通过获取所有的tr标签后进行遍历,但是这个网站的手机号字段需要点击获取按钮才可以看到,

用的是ajax+Dialogue模态框(还好前两天刚用php+bootstrap过做了个后台项目,机智如我),通过firedebug+httpfox抓包看到每次点击查看号码后,POST请求的都是同一个页面,

返回的数据竟然不仅仅是手机号!是用户信息的所有字段!网页结构瞬间难度降低.只需要获取总页数和用户Id就可以抓数据了!总页数通过指定的string获取即可,用户Id通过指定

的class获取tag.find('a', attrs={'class':'see'}),然后再去href属性,再取数字,用户的id就被取到了。

3.循环获取数据

上面已经获取了总页数和用户Id了,现在只要循环总页数次*每次的数据tr行数就可以获取全部数据.

在方法外定义一个for循环,循环了总页数次,由于有的用户没有点击查看用户联系方式(vip不可以被查看),导致有时获取用户Id时失败,所以在获取用户id时加了个判断,如果为空,

则跳出本次获取用户数据循环,成功获取数据后发现获取的数据时bytes类型,无法json解析,经过一番资料查询,确定bytes转str再转json,实际执行中发现个别人的数据无法转换,

原因不明,加了个判断先绕过去!至此,已经获取到了想要的数据了,可以通过json名['字段名']获取数据.

4.mysql存储

经过一系列的磨难,就差一步存储就可以完成了.

mysql的python只支持到了3.4版本,所以3.6版本用不了,中间尝试N次失败告终,又在网站搜集一番资料,发现用pymysql,写了个连接测试文件,测试后没问题,拷贝到这里,

万事俱备只欠东风,开始执行xxx.py,直接报错,数据库连接被关闭???然后发现数据库被关闭后再次写入没有开启,调整了下语句,继续测试,ok了,采集了40多页后报错,遇到了对方是

vip的问题,果断判断一下跳过,然后页数循环那里加上判断直接从40+页开始循环,执行到70+页后出现人名无法存数据库,不知道什么原因,直接跳过指定id继续执行,最后成功抓取107页数据.

然后通过phpmyadmin可以导出各种格式.

5.后记

路漫漫其修远兮 吾将上下而求索

自学过程中会遇到各种坑,各种问题,一定要坚持下去,可以通过搜索引擎找到答案.

等有时间了还是要把代码封装一下,规范一点,希望以后可以复用.

虽然最后实现了功能,还是有很多不完善的地方,以后慢慢改进!

#-*-coding:utf-8-*- #编码声明
import requests
from bs4 import BeautifulSoup
import re,time
import pymysql.cursors
import json
def getCookie():
cookie = {}
raw_cookies = 'UM_d=1440;saf=6E4FBE;AJes=7; ASId=45'#引号里面是cookie,用抓包工具来获得
for line in raw_cookies.split(';'):
key,value = line.split("=", 1)
cookie[key] = value #一些格式化操作,用来装载cookies
return cookie
def getData(num):
url = 'http://www.xxx.com/xxx/allmessage_' + str(num) + '.html'
print('当前抓取网址' + url)
 
res = requests.get(url,cookies=getCookie())
content = res.content
saveData(content)
return content
def getPageNum():
url = 'http://www.xxx.com/xxx/allmessage.html'
 
res = requests.get(url,cookies=getCookie())
content = res.content
soup = BeautifulSoup(content,'html.parser')
pageStr = soup.find_all('a')
mystr = pageStr[-1]['href']
pageNum = re.sub("\D", "", mystr)
return pageNum
def saveData(content):
conn = pymysql.Connect(user='root', password='root', database='user',charset="utf8")
 
soup = BeautifulSoup(content,'html.parser')
tb = soup.find_all('tr',style='text-align:center;')
for tag in tb:
 
see = tag.find('a', attrs={'class':'see'})
if not see:
continue
seestr = see['onclick']
seenum = re.sub("\D", "", seestr)
#根据seenum获得指定用户信息
userinfo = seeInfo(int(seenum))
#这个userinfo是 bytes类型,先转换成str,再转换成json,真麻烦!
strdata = str(userinfo, encoding = "utf-8")
strdata = strdata.encode('UTF-8')
if seenum == 404831:
print(strdata)
 
jsondata = json.loads(strdata)
cursor = conn.cursor()
cursor.execute('insert into my_userinfo (see, sendtime, name, phone, content, weixin, qq) values (%s, %s, %s, %s, %s, %s, %s)', [int(seenum), jsondata['time'], jsondata['name'], jsondata['phone'], jsondata['content'], jsondata['weixin'], jsondata['QQ']])
cursor.rowcount
# 提交事务:
conn.commit()
cursor.close()
#print(str(seenum) + '写入成功!')
def seeInfo(id):
url = 'http://www.xxx.com/xxx/tel.html'
info = {'id':id}
 
res = requests.get(url,cookies=getCookie(),data=info)
content = res.content
#with open("./new/json_"+str(id)+".txt", 'wb') as f:
#f.write(content)
return content
maxPage = getPageNum()
for num in range(int(maxPage)):
if page > 106:
 
content = getData(page)
with open("./new/content_"+str(page)+".html", 'wb') as f:
f.write(content)
print('第' + str(page) +'页保存成功!两秒后继续抓取!')
time.sleep(2)

20170717_python_爬虫_网页数据解析_BeautifulSoup_数据保存_pymysql的更多相关文章

  1. Python爬虫教程-18-页面解析和数据提取

    本篇针对的数据是已经存在在页面上的数据,不包括动态生成的数据,今天是对HTML中提取对我们有用的数据,去除无用的数据 Python爬虫教程-18-页面解析和数据提取 结构化数据:先有的结构,再谈数据 ...

  2. 爬虫、网页分析解析辅助工具 Xpath-helper

    每一个写爬虫.或者是做网页分析的人,相信都会因为在定位.获取xpath路径上花费大量的时间,甚至有时候当爬虫框架成熟之后,基本上主要的时间都花费在了页面的解析上.在没有这些辅助工具的日子里,我们只能通 ...

  3. 2.2 Xpath-helper (chrome插件) 爬虫、网页分析解析辅助工具

    1. Xpath-helper下载 可以直接在chrome浏览器中的扩展程序搜索 Xpath-helper进行添加 也可以直接在http://www.chromein.com/crx_11654.ht ...

  4. 爬虫_网页url设计

    为什么需要网页URL设计? 每个url不同的结构代表着不同的网页模块和信息的展现形式,为了方便维护与管理 网页url怎么设计? 分层: 主域名,子域名 一般形式为: 主域名:  www.job.com ...

  5. post请求获取json数据 解析json数据

    <script> window.onload = function () { var str; // console.log(@ViewBag.ID); $.post("/Ser ...

  6. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...

  7. ADs系列之通用数据解析服务GAS(即将开源)

    面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时 ...

  8. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  9. IOS 请求数据解析 XML 和 JSON

    好久没写文章了,回忆一下以前的内容记录一下吧. 这一段主要接触的就是数据解析,就说一下数据解析 现在数据解析一般解析两种数据 xml 和 JSON 那就从xml解析说起吧 xml解析需要用到一个类 N ...

随机推荐

  1. 网页中使用CSS和JS阻止用户选择内容

    CSS实现 body{ -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; ...

  2. python+requests+unittest API接口测试

    黑熊再网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,见用例维护在文本或表格中,而没有说明怎么样去生成想要的用例, 问题: 测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空, ...

  3. XCode 8.3 Automatically manage signing 问题

    记录iOS证书问题 无意中选择了Personal team,后台自动生成bundle identifier:com.xxx.project,导致不能在Organization team创建,而且在de ...

  4. 提高java编程质量 - (五)switch语句break不能忘以及default不同位置的用法

    先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...

  5. Vulkan Tutorial 15 Framebuffers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 我们在前面的章节中已经讨论了很多次framebuffers帧缓冲区,到目前为止我们配 ...

  6. 假如时光倒流,我会这样学习Java

    回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路. [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到 ...

  7. sleep()方法和wait()方法之间有什么差异?

    sleep()方法用被用于让程序暂停指定的时间,而wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者nofifyAl()方法 主要的区别是,wait()释放 ...

  8. Linux回炉复习系列文章大纲

    本人最近在回炉Linux的内容,也做了很多整理,顺便也想将整理的内容分享出来. 由于该系列文章的内容主要是复习整理而来,其中绝大多数命令都是翻译和整理man或info文档总结的,另外很多地方也没有给出 ...

  9. 深入理解 JavaScript 事件循环(一)— event loop

    引言 相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的异步概念 .在初期许多人会把异步理解成类似多线程的编程模式 ...

  10. Linux命令 用户管理命令

    groupadd [功能说明] 新建用户组 [语法格式] Groupadd[-f][-r][-g<GID><-o>][组名] [选项参数] 参数 说明 -f 建立已存在的组,强 ...