上午废了老大劲成功登陆后,下午看了下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中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

  2. iOS CAReplicatorLayer 实现脉冲动画效果

    iOS CAReplicatorLayer 实现脉冲动画效果 效果图 脉冲数量.速度.半径.透明度.渐变颜色.方向等都可以设置.可以用于地图标注(Annotation).按钮长按动画效果(例如录音按钮 ...

  3. JavaScript 扫描枪使用(一)

    JavaScript 扫描枪应用(一)com.js为主要的代码实现,test.html文件为测试的页面,其中包括了com.js文件中方法的调用.以下为测试成功代码:com.js //com.js /* ...

  4. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  5. implements ApplicationContextAware 获取spring 容器

    1.新建 ApplicationContextUtil 类 ,通过实现 ApplicationContextAware 的 setApplicationContext 方法,得到context上下文: ...

  6. 使用JPA和Hibernate进行批量处理的最佳方式

    Tips 原文作者:Vlad Mihalcea 原文地址:The best way to do batch processing with JPA and Hibernate 在本文中,你将了解什么是 ...

  7. Ruby中文乱码问题

    中文乱码问题 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了. 源代码文件中,若包含中文编码,则需要注意两点: ...

  8. 使用ConfuserEx加密混淆程序以及如何脱壳反编译

    一,准备如下工具: ConfuserEx.UnConfuserEx.Fixer.ConfuserExStringDecryptor.ConfuserExSwitchKiller.de4dot.ILSp ...

  9. selenium webDriver给隐藏域赋值 input hidden set value

    //直接这样无法给input hidden赋值// driver.findElement(By.id("image_default")).sendKeys("a1112. ...

  10. (cljs/run-at (JSVM. :browser) "命名空间就这么简单")

    前言  一个cljs文件定义一个命名空间,通过命名空间可以有效组织代码,这是构建大型系统必备的基础设施.本篇我们就深入理解cljs中的命名空间吧! 好习惯从"头"开始 每个cljs ...