上午废了老大劲成功登陆后,下午看了下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. Java阶段性测试--第二三大题参考代码

    第二大题: 1.打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于它本身 package Test1; //1.打印出所有的 ...

  2. jQuery UI 入门之实用实例

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  3. html加javascript和canvas类似超级玛丽游戏

    html加javascript和canvas制作 代码来源于网上 复制可用 <!doctype html><html lang="en"> <head ...

  4. sock

    头和尾基本用来做校验, 不是拿来做边界的. 头+类型+长度+数据+尾, 这种结构就可以. 拆包就是: 检验头, 然后拆出类型+长度, 然后根据长度拆数据, 然后检验尾巴.

  5. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  6. MySQL left join操作中 on与where放置条件的区别

    优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 1 1 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里 ...

  7. Java 基础 程序流程控制 (下)

    Java 程序流程控制 (下) 此篇单独对循环结构的知识点进行整理: 之前讲到循环结构分为:for循环,while循环,do...while循环三种最基本的循环结构:在JDK1.5以后的版本还提供了f ...

  8. 安装Dubbo注册中心(Zookeeper-3.4.6)

    样例视频教程:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd Dubbo建议使用Zookeeper作为服务的注册中 ...

  9. 如何利用keytool查看一个apk的签名

  10. str-字符串功能介绍

    叨逼叨:字符串的各个功能修改不是本身,本身不变,会产生新的值,需要赋值给新的变量来接收 以下 "举例" 是解释每个功能的实例   "举例"下一行是pycharm ...