有关爬虫和存入数据库中的一些小问题,小bug
开发任务:爬取某微信公众号上的相关文章
开发环境:python3.6 + MySQL5.7
Part 1 :爬虫
思路:首先我们要爬取微信公众号,首先想到的肯定是直接上网址,然后浏览器打开,分析页面结构,层层剥离,最后得到我们想要的数据。老实说,这倒是我接到这个任务的第一思路,然后我就屁颠屁颠的开始执行这个操作,打开微信,
找到了那个微信公众号,打开历史消息微信客户端——很清晰,很明了:
这结构那是相当的棒,条理清晰,思路分明,暗中窃喜一波儿,然后开开心心的将网址,然后复制到浏览器打开,然后满心欢喜的准备分析结果来着,然后就没有然后了。。——意外发生了。。。。。
果然还是腾讯爸爸厉害一点。。真心没辙。。然后我网上找了找相关的解决方案,网上dalao们给出的建议是使用js脚本,将其中的一个参数is_wechat的值进行修改,然后就能够实现了。然而我对于js是相当的不熟悉。。仅仅停留在能够看懂语法的状态。。。然后这条路就被无情的被斩断了。。
继续探究:好在我们有一个搜狗微信的外部网站之一帮助我们用来搜索微信公众号,这一下就很开心,找到了替代方案,终于不用愁容满面了。 然后我又一次屁颠屁颠的打开了,浏览器找到搜狗微信的网址,上面输入“影探”,很完美,找到了这个公众号,然后点击进去,哈哈哈,美滋滋
这样,我们就完成了,爬虫第一步的最开始的初始化的一步!!!美滋滋。
然后我们打开我们的F12,分析网页,查看数据。
——火眼金睛,一次就发现这些数据是js动态加载的。。而且,我们需要的所有数据全部在一个变量msgList里面,更刺激的是!!!这个msgList天生一个json数据文件的模样!!!这岂不是天助我也!!!
这下我们获取这个网页之后,通过正则匹配,直接将msgList的json数据格式文件直接取出来。然后再针对json数据进行解析,美哉!
然后我们很成功的将以上的这个网址获取,使用正则表达式获取写出了以下的代码:
from bs4 import BeautifulSoup
import re
import requests
import json
import jsonpath
import pymysql
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
# 这样分两次获得最后网址是因为,直接访问网址的话,那个网址具有时效性,一段时间之后那个网址就失效了
originUrl = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query=%E5%B7%A5%E5%A4%A7%E6%A2%A6%E4%B9%8B%E7%BF%BC&ie=utf8&_sug_=n&_sug_type_='
originHtml = requests.get(originUrl, headers = headers)
bsObj = BeautifulSoup(originHtml.text, 'lxml')
url = bsObj.find(class_ = 'tit').a['href']
html = requests.get(url)
soup = BeautifulSoup(html.text, 'lxml')
pattern = re.compile(r'var msgList = {.*?};', re.I | re.M)
script = soup.findAll('script')[8]
msgList = pattern.findall(script.text)
for msg in msgList:
print(msg)
#解析出正确的json格式文件
mJson = msg[14:-1]
然后根据正确的网址,我将其中的数据使用json进行解析。然后将数据准备存入数据库。
loadJson = json.loads(mJson)
# 一个描述的数组
digest = jsonpath.jsonpath(loadJson, '$..digest')
# 一个标题的数组
title = jsonpath.jsonpath(loadJson, '$..title')
# 一个图片的数组
pic = jsonpath.jsonpath(loadJson, '$..cover')
# 一个链接的url数组
urls = jsonpath.jsonpath(loadJson, '$..content_url')
Part 2 :存入数据库
我们首先安装好MySQL,从官网上下载MySQL的安装包, 然后将压缩包进行解压,在bin目录之下打开cmd或者powershell,使用mysqld -initialize进行初始化进行操作。
然后就输入mysql这个命令,结果,出现了以下的错误:
`Access denied for user 'root'@'localhost'`
这下可急坏我了,这样的操作可不是我们愿意见到的,拿出万能的工具,借助万能的网友的力量——百度,进行搜索,最后得到了好的解决方案——
首先,直接在命令行输入以下的代码:
`mysqld --skip-grant-tables`
然后直接输入以下的代码:
$ mysql
Your MySQL connection id is 3
Server version: 5.7.21 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql>
然后就实现了操作。
# 链接数据库
conn = pymysql.connect(host = '127.0.0.1', port = 3306, user = 'root', passwd = '', charset = 'utf8', db = 'test')
cursor = conn.cursor()
for i in range(len(digest)):
sql = 'insert into app values(\"%s\", \"%s\", \"%s\", \"%s\")' % (digest[i], title[i], pic[i], urls[i])
row = cursor.execute(sql)
conn.commit()
row1 = cursor.execute('select * from app')
data = cursor.fetchall()
print(data)
conn.close()
这就实现了存入数据库中。
以上。