上午废了老大劲成功登陆后,下午看了下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. mac下sublime text3 安装px转rem插件

    本人使用的是os-x系统,即mac系统,每次使用单位rem用其他网页转换很不方便.自己捣腾了一下插件,现在共享给大家 第一步: 先下载插件: https://github.com/narrow-gat ...

  2. MQ产品比较-ActiveMQ-RocketMQ

    几种MQ产品说明: ZeroMQ :  扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...

  3. ci框架学习告一段落,总结一下

    从网上弄了一张框架学习思维导图,从图中就可以看出ci用了设计模式中的MVC架构,使得用起来很简单方便 用了大概两个星期开发了一个<文章管理系统>觉得开发过程中学到了很多,挺不错的,而且在学 ...

  4. linux定时任务访问url

    这次linux定时任务设置成功,也算是自己学习linux中一个小小的里程碑.:) 撒花撒花--- 以下操作均是在ubuntu 下操作的,亲测有效,其他的linux系统还望亲们自己去查.鞠躬感谢! 1 ...

  5. php 多条件查询

    1.效果图如下: 点击提交后,把符合条件的筛选出来 2.代码: 逻辑:选中数据----以数组方式提交---拼接sql语句 难点: (1)从数据库里读取的数据要去重 (2)读取的数据是数组,要拼接 (3 ...

  6. CSS中的尺寸单位

    绝对单位 px: Pixel 像素 pt: Points 磅 pc: Picas 派卡 in: Inches 英寸 mm: Millimeter 毫米 cm: Centimeter 厘米 q: Qua ...

  7. [项目记录]一个.net下使用HAP实现的吉大校园通知网爬虫工具:OAWebScraping

    第一章 简介 本文主要介绍了在.NET下利用优秀的HTML解析组件HtmlAgilityPack开发的一个吉林大学校内通知oa.jlu.edu.cn的爬取器.尽管.Net下解析HTML文件有很多种选择 ...

  8. Normalize.css介绍,作用,使用方法

    介绍 Normalize.css 是一个很小的CSS文件(V5.0.0版本大小8KB),但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.c ...

  9. 百度地图 js api 实现 line 居中显示

    项目中有个需求需要在百度地图的中心显示画的线,以前用过mapPanto这个方法,传入坐标就可以将地图平移到这个坐标,不过不知道如何获取线的中心点,看了别人的代码,有以下两个函数可以实现这个功能 get ...

  10. fedora安装QQ

    只看重利益的TC根本没想到要维护和更新linux版本的QQ,所幸fedora linux的中文社区 (https://repo.fdzh.org) 对大家比较照顾,还是针对fedora做了wine Q ...