分析思路
目标网站: glidedsky第二题
第一步
爬虫首先想最简单的想法,直接requests.get(url),然后分析获得的网页源代码,如果成功,完全不需要其他的高级方法了,见代码及结果:
from lxml import etree
import requests
#目标网址
url = r'http://glidedsky.com/level/web/crawler-basic-2?page=1'
r = requests.get(url)
if '299' in r.text:
print("成功进入")
else:
print("进入失败")
#根据xpath语法获取网页中想要的信息
# selector = etree.HTML(r.text)
# nums = selector.xpath("//div[@class='row']/div[@class='col-md-1']/text()")
# print(nums)
结果截图:
第二步
很明显,直接爬取是失败了,再高级一点,加头,加cookies,再尝试
#加头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
sess = requests.session()
sess.headers = headers
r = sess.get(url)
#加cookies也是一样
很明显结果还是不对,不然对我个人而言没有提升,也就没有必要记录了
第三步
随你的想法来,想到啥招尽管上,但是注意不要犯法,警惕可能被封IP。
我是用selenium模拟一半,登上之后再用requests快速爬完1000页的数据,可以只用selenium,但是太慢了
driver = webdriver.Firefox()#火狐浏览器对象
url = r'http://glidedsky.com/login'#登录界面
driver.get(url)
driver.maximize_window()
time.sleep(3)
#定位输入(填自己的用户名和密码)
driver.find_element_by_id("email").send_keys("用户名")
driver.find_element_by_id("password").send_keys("密码")
#点击登陆
driver.find_element_by_class_name('btn-primary').click()
time.sleep(3)
#检验是否成功
if driver.current_url == 'http://glidedsky.com/':
print("登陆成功")
else:
print("失败")
这一次就模拟登录成功了,但是还不是目标网站,还有重要的一步,获取cookies,并交给requests.session()自动维护
sess = requests.session()
cookie_dict = driver.get_cookies()#获取上一步的成果,网页的cookies
cookie = {}
for i in cookie_dict:
cookie[i["name"]] = i["value"]
# 把cookie字典转化为cookiejar
cookies = requests.utils.cookiejar_from_dict(cookie, cookiejar=None,overwrite=True)
#加头
sess.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
#网址翻页不变的部分
base_url = 'http://glidedsky.com/level/web/crawler-basic-2?page='
#直接获得目标网址,并爬取1000页(计算就自己解决了吧)
for i in range(1,1001):
re_ur = base_url+str(i)
r = sess.get(re_ur,cookies=cookies)
selector = etree.HTML(r.text)
#获取每页的10个数字
num_li = selector.xpath('//div[@class="row"]/div[@class="col-md-1"]/text()')
最终也很快就结束了,因为这个网站是测试用的,所有没有其他例如封IP,验证码,字体反爬之类的措施,只要进去了目标网址,基本就没有难度了。