七月在线爬虫班学习笔记(四)——相关库使用与登录问题
requests运行代码示例:
import json import requests from PIL import Image from io import BytesIO # print(dir(requests)) ''' url = 'http://www.baidu.com' r = requests.get(url) print(r.text) print(r.status_code) print(r.encoding) ''' # 传递参数:不如http://aaa.com?pageId=1&type=content ''' params = {'k1':'v1', 'k2':'v2'} r = requests.get('http://httpbin.org/get', params) print(r.url) ''' # 二进制数据 ''' r = requests.get('http://i-2.shouji56.com/2015/2/11/23dab5c5-336d-4686-9713-ec44d21958e3.jpg') image = Image.open(BytesIO(r.content)) image.save('meinv.jpg') ''' # json处理 ''' r = requests.get('https://github.com/timeline.json') print(type(r.json)) print(r.text) ''' # 原始数据处理 ''' r = requests.get('http://i-2.shouji56.com/2015/2/11/23dab5c5-336d-4686-9713-ec44d21958e3.jpg', stream = True) with open('meinv2.jpg', 'wb+') as f: for chunk in r.iter_content(1024): f.write(chunk) ''' # 提交表单 ''' form = {'username':'user', 'password':'pass'} r = requests.post('http://httpbin.org/post', data = form) print(r.text) r = requests.post('http://httpbin.org/post', data = json.dumps(form)) print(r.text) ''' # cookie ''' url = 'http://www.baidu.com' r = requests.get(url) cookies = r.cookies for k, v in cookies.get_dict().items(): print(k, v) ''' ''' cookies = {'c1':'v1', 'c2': 'v2'} r = requests.get('http://httpbin.org/cookies', cookies = cookies) print(r.text) ''' # 重定向和重定向历史 ''' r = requests.head('http://github.com', allow_redirects = True) print(r.url) print(r.status_code) print(r.history) ''' # 代理 ''' proxies = {'http': ',,,', 'https': '...'} r = requests.get('...', proxies = proxies) '''
BeautifulSoup代码示例:
在课程中用到了test.html,内容如下:
<html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p>
from bs4 import BeautifulSoup soup = BeautifulSoup(open('test.html'), "lxml") print(soup.prettify()) #格式规范化后
# Tag print(type(soup.title)) print(soup.title.name) print(soup.title) #输出 <class 'bs4.element.Tag'> title <title>The Dormouse's story</title> # String print(type(soup.title.string)) print(soup.title.string) #输出 <class 'bs4.element.NavigableString'> The Dormouse's story # Comment print(type(soup.a.string)) print(soup.a.string) #输出 <class 'bs4.element.Comment'> Elsie for item in soup.body.contents: print(item.name) #输出 None p None p None p # CSS查询 print(soup.select('.sister')) print(soup.select('#link1')) print(soup.select('head > title')) a_s = soup.select('a') for a in a_s: print(a)
<html> <head> <title> The Dormouse's story </title> </head> <body> <p class="title" name="dromouse"> <b> The Dormouse's story </b> </p> <p class="story"> Once upon a time there were three little sisters; and their names were <a class="sister" href="http://example.com/elsie" id="link1"> <!-- Elsie --> </a> , <a class="sister" href="http://example.com/lacie" id="link2"> Lacie </a> and <a class="sister" href="http://example.com/tillie" id="link3"> Tillie </a> ; and they lived at the bottom of a well. </p> <p class="story"> ... </p> </body> </html>
在课程中提到在安装markupbase中有个坑需要大家注意。markupbase安装方法,直接’pip install’是无法安装成功,尝试命令’pip search markupbase’得到包名’micropython-markupbase’,然后直接在网页上下载这个包,下载后里面有一个’_markupbase.py’文件,将文件名开头的’‘去掉后文件复制到python安装目录’\Lib\site-packages’下(如我的电脑’C:\ProgramData\Anaconda3\Lib\site-packages‘)
from HTMLParser import HTMLParser # markupbase class MyParser(HTMLParser): #继承基类来写自己的解析器,Sax模式 def handle_decl(self, decl): HTMLParser.handle_decl(self, decl) print('decl %s' % decl) def handle_starttag(self, tag, attrs): HTMLParser.handle_starttag(self, tag, attrs) print('<' + tag + '>') def handle_endtag(self, tag): HTMLParser.handle_endtag(self, tag) print('</' + tag + '>') def handle_data(self, data): HTMLParser.handle_data(self, data) print('data %s' % data) #<br/> def handle_startendtag(self, tag, attrs): HTMLParser.handle_startendtag(self, tag, attrs) def handle_comment(self, data): HTMLParser.handle_comment(self, data) print('data %s' % data) def close(self): HTMLParser.close(self) print('Close') demo = MyParser() demo.feed(open('test.html').read()) demo.close()
输出结果:
C:\ProgramData\Anaconda3\python.exe D:/PycharmProjects/spider1/htmpp_sample.py decl DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" data data data </meta> data data Rollen Holt - cnblogs </title> data </meta> data </link> data </link> data </link> data </link> data </link> data </link> data </link> data </link> data </script> data </script> data </script> data </script> data </script> data </head> data data </a> data data data </input> data </div> data </form> data </body> data </html> Close Process finished with exit code 0
sqlite:
import sqlite3 conn = sqlite3.connect('test.db') create_sql = 'create table company(id int primary key not null, emp_name text not null);' conn.execute(create_sql) insert_sql = 'insert into company values(?, ?)' conn.execute(insert_sql, (100, 'LY')) conn.execute(insert_sql, (200, 'July')) cursors = conn.execute('select id, emp_name from company') for row in cursors: print(row[0], row[1]) conn.close() #results 100 LY 200 July
豆瓣爬虫:
import requests import html5lib import re from bs4 import BeautifulSoup s = requests.session() url_login = 'http://accounts.douban.com/login' formdata = { 'redir': 'https://www.douban.com', 'form_email': '*********@qq.com', 'form_password': '********', 'login': u'登陆' } headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/44.0.2403.157 Safari/537.36'} r = s.post(url_login, data=formdata, headers=headers) content = r.text soup = BeautifulSoup(content, 'html5lib') #验证码图片 captcha = soup.find('img', id = 'captcha') #判断是否有验证码图片,有则处理无则跳过 if captcha: captcha_url = captcha['src'] #正则表达式 re_captcha_id = r'<input type="hidden" name="captcha-id" value="(.*?)"/' captcha_id = re.findall(re_captcha_id, content) print(captcha_id) print(captcha_url) captcha_text = input('Please input the captcha:') formdata['captcha-solution'] = captcha_text formdata['captcha-id'] = captcha_id r = s.post(url_login, data=formdata, headers=headers) with open('contacts.txt', 'w+', encoding='utf-8') as f: f.write(r.text)
login_cookie:
chrome找cookie:
1.F12,点击Network信息;
2.选择network标签,刷新网页(在打开调试工具的情况下刷新);
3.刷新后’Name’找到该网页url,点击 后右边选择headers,就可以看到当前网页的http头了,在requests headers里有cookie;
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'} cookies = {'cookie': 'bid=yziFQhTcZIQ; ps=y; ll="108288"; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1482927892%2C%22https%3A%2F%2Faccounts.douban.com%2Fsafety%2Fbind_resetpassword%3Fconfirmation%3Dd45af5b19bdc537f%26alias%3Dliyanan001%2540yeah.net%22%5D; ue="liyanan001@yeah.net"; dbcl2="76208527:9XkES3vv3uM"; ck=rRSb; __utmt=1; ap=1; push_noty_num=0; push_doumail_num=0; _pk_id.100001.8cb4=ea6d754ff65bcdd2.1474347257.6.1482929703.1481331480.; _pk_ses.100001.8cb4=*; __utma=30149280.2078507961.1473603369.1481331480.1482927892.8; __utmb=30149280.22.10.1482927892; __utmc=30149280; __utmz=30149280.1482927892.8.8.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/safety/bind_resetpassword; __utmv=30149280.7620; _vwo_uuid_v2=EB8F16618A0E0BB2959FE9B0E842F251|8cdbe50b30acbb8304a6cfd0bdf4e501'} url = 'http://www.douban.com' r = requests.get(url, cookies = cookies, headers = headers) with open('douban_2.txt', 'wb+') as f: f.write(r.content)
豆瓣爬电影数据:
import requests from lxml import etree s = requests.Session() for id in range(0, 251, 25): url = 'https://movie.douban.com/top250/?start-' + str(id) r = s.get(url) r.encoding = 'utf-8' root = etree.HTML(r.content) items = root.xpath('//ol/li/div[@class="item"]') for item in items: title = item.xpath('./div[@class="info"]//a/span[@class="title"]/text()') name = title[0].encode('gb2312', 'ingore').decode('gb2312') rating = item.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0] print(name, rating)
#result 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1 肖申克的救赎 9.6 霸王别姬 9.5 这个杀手不太冷 9.4 阿甘正传 9.4 美丽人生 9.5 千与千寻 9.3 泰坦尼克号 9.3 辛德勒的名单 9.4 盗梦空间 9.3 机器人总动员 9.3 三傻大闹宝莱坞 9.2 海上钢琴师 9.2 忠犬八公的故事 9.2 放牛班的春天 9.2 大话西游之大圣娶亲 9.2 楚门的世界 9.1 龙猫 9.1 教父 9.2 熔炉 9.2 星际穿越 9.2 乱世佳人 9.2 触不可及 9.1 无间道 9.0 当幸福来敲门 8.9 天堂电影院 9.1
情不知所起一往而深